django最后更新在没有新信息时不断更新

时间:2015-10-27 12:07:18

标签: python django

我有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,
    })

2 个答案:

答案 0 :(得分:1)

looks like update_or_create来电Model.save()。在决定是否应保存(调用save())之前,您可以轻松覆盖模型的super().save()方法以执行某些检查。

save()内,您可以确定数据是否已更改。为此:self_old = Product.objects.get(pk=self.pk)并且不要忘记抓住Product.MultipleObjectsReturnedProduct.DoesNotExist

现在,要将selfself_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']) 如果不存在,请在表中添加新记录。 如果确实存在,请检查可能更改的字段是否已更新,如果没有,则不执行任何其他更新。