You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django商品存在时更新价格否则新增,解决查询集为空问题

问题根源分析

你遇到的重复添加问题,核心原因有两个:

  1. 混用ORM与原生SQL操作:Django根据Product模型生成的表是[你的应用名]_product(比如应用叫scraper就是scraper_product),但你用save_to_db函数直接创建了products表,两个表完全独立。ORM查询的是Django生成的表,永远找不到原生插入的数据,导致每次都走新增逻辑。
  2. 字段长度不足:模型中url和img的max_length=50远小于实际爬取的链接长度,会导致数据截断,即使后续用ORM操作也会出现匹配失败或保存异常。
解决方案

1. 修复模型字段长度

修改Product模型的url和img字段,将长度调整为足够容纳实际链接的值:

class Product(models.Model):
    name = models.CharField(max_length=200)
    current_price = models.CharField(max_length=50)
    place = models.CharField(max_length=50)
    url = models.CharField(max_length=2000)  # 增大长度
    img = models.CharField(max_length=2000)  # 增大长度
    date_add = models.DateTimeField(default=timezone.now)

    def __str__(self):
         return self.name

执行数据库迁移,让修改生效:

python manage.py makemigrations
python manage.py migrate

2. 删除原生SQL的save_to_db函数,改用Django ORM操作

直接用Django内置的get_or_create方法,一步实现「存在则更新,不存在则创建」的逻辑,避免手动判断的误差:

from django.utils import timezone

def cellphones(query):
    lists = []
    search = query.replace(' ', '%20')
    url = f"https://cellphones.com.vn/catalogsearch/result?q={search}" 
    driver.get(url)
    content = driver.find_element(By.CSS_SELECTOR, "div[id*='search-catalog-page']")
    items = content.find_elements(By.CSS_SELECTOR, "div[class*='product-info']")
    
    for _ in items:
        # 提取商品数据
        item_url = _.find_element(By.CSS_SELECTOR, "a").get_attribute('href')
        item_name = _.find_element(By.CSS_SELECTOR, "h3").text
        item_price = _.find_element(By.CSS_SELECTOR, "p[class*='product__price--show']").text
        item_place = "Cellphones"
        item_img = _.find_element(By.CSS_SELECTOR, "img").get_attribute('src')
        current_date = timezone.now()

        # 用get_or_create判断是否存在
        product, created = Product.objects.get_or_create(
            name=item_name,
            place=item_place,
            defaults={
                'url': item_url,
                'current_price': item_price,
                'img': item_img,
                'date_add': current_date
            }
        )

        # 若已存在,更新价格、图片和时间
        if not created:
            product.current_price = item_price
            product.img = item_img
            product.date_add = current_date
            product.save()
        
        lists.append(product)
    return lists

3. 清理冗余数据

打开db.sqlite3数据库,手动删除之前用原生SQL创建的products表,避免数据冗余。

内容的提问来源于stack exchange,提问作者Dung8466

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:30:55