Django:跟踪模型中的字段是否更改

时间:2016-04-13 13:42:00

标签: python django django-models

我有一个模特:

class Object(Object1):
    name = models.CharField(max_length=255, blank=True)
    description = models.TextField(blank=True)
    date_updated = models.DateTimeField(blank=True, null=True)

我想跟踪是否在date_updated字段中插入了任何内容,然后在另一个模型中创建另一个对象,而不覆盖save方法。

例如:

if date_updated:
    MyModel.objects.create(type="D", user=request.user)

虽然我尝试了this,但仍然没有成功。

2 个答案:

答案 0 :(得分:0)

抱歉,您注意到您正在引用request.user。所以这对你不起作用。由于您需要特定的request对象,因此最好在request对象所指的视图中完成。

使用pre_save,您可以将当前实例的属性值与当前数据库中的属性值进行比较。

@receiver(pre_save, sender=MyModel)
def check_date(sender, instance=None, created=False, **kwargs):
    changed = created or instance.date_updated != MyModel.objects.get(pk=instance.pk).date_updated

    if changed:
        MyModel.objects.create(type="D", user=request.user)

但是没有测试它。

答案 1 :(得分:0)

您可以使用django-model-utils中的tracker字段。

向模型添加跟踪器:

class Object(Model):
    name = models.CharField(max_length=255, blank=True)
    description = models.TextField(blank=True)
    date_updated = models.DateTimeField(blank=True, null=True)

    tracker = FieldTracker()

您可以在save()或其他通常更新模型的地方办理登机手续:

if object.tracker.has_changed('date_updated'):

    create_new_object(data)