Django商品存在时更新价格否则新增,解决查询集为空问题
问题根源分析
你遇到的重复添加问题,核心原因有两个:
- 混用ORM与原生SQL操作:Django根据
Product模型生成的表是[你的应用名]_product(比如应用叫scraper就是scraper_product),但你用save_to_db函数直接创建了products表,两个表完全独立。ORM查询的是Django生成的表,永远找不到原生插入的数据,导致每次都走新增逻辑。 - 字段长度不足:模型中
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
相关产品推荐
相关产品推荐

