我有django
模型,即使没有更改信息,也会更新last_updated
字段。 (信息来自通过 scraper 的dict)。有时会有新的产品条目,或条目的更新,或通常没有变化。如何进行修改,以便仅在产品有新信息(或创建新信息)时更新last_updated
字段?
模特:
class Product(models.Model):
unique_id = models.IntegerField(unique=True)
name = models.CharField(max_length=255)
supplier = models.ForeignKey(Supplier)
region = models.ForeignKey(PowerRegion)
last_updated = models.DateTimeField(auto_now=True)
刮刀通过以下方式更新数据:
product, created = Product.objects.update_or_create(
unique_id=product_detail['productId'],
defaults={
'name': product_detail['productName'],
'supplier': supplier,
'region': region,
})
答案 0 :(得分:1)
looks like update_or_create
来电Model.save()
。在决定是否应保存(调用save()
)之前,您可以轻松覆盖模型的super().save()
方法以执行某些检查。
在save()
内,您可以确定数据是否已更改。为此:self_old = Product.objects.get(pk=self.pk)
并且不要忘记抓住Product.MultipleObjectsReturned
和Product.DoesNotExist
。
现在,要将self
与self_old
进行比较,您可以比较单个字段或使用this snippet。
** 已更新 **
如果我现在想起来......请避免使用Product.objects.update_or_create
。以下是更新数据的方法:
defaults = {'name':..., 'supplier':..., ...}
try:
instance = Product.objects.get(**defaults)
# if no exception, the product doesn't need to be updated (*1)
except Product.DoesNotExist:
# the product needs to be created or updated
try:
instance = Product.objects.get(pk=product_detail['productId'])
except Product.DoesNotExist:
# needs to be created
Product(**defaults).save()
else:
# needs to be updated
instance.update(defaults)
我仍然知道它比update_or_create更复杂。告诉我你是否知道更好的解决方案:)
答案 1 :(得分:0)
您需要确定的第一件事是在发生变化时最有可能改变的字段。
然后检查product_detail [' productId']是否存在:
Product.objects.get(unique_id=product_detail['productId'])
如果不存在,请在表中添加新记录。
如果确实存在,请检查可能更改的字段是否已更新,如果没有,则不执行任何其他更新。