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

Python Django:跟踪模型中的字段是否更改,python,django,django-models,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字段中是否插入了任何内容,然后在另一个模型中创建另一个对象,而不重写sa

我有一个模型:

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)
虽然我已经尝试过了,但仍然没有成功。

对不起,刚才注意到您正在引用
请求。用户
。所以这对你不起作用。由于您需要特定的
请求
对象,因此最好在
请求
对象所引用的视图中完成

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

@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)
但是没有测试它。

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

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

@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)

但是,没有测试它。

您可以从中使用
跟踪器
字段

将跟踪器添加到模型:

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()
if object.tracker.has_changed('date_updated'):

    create_new_object(data)
您可以签入
save()
或在通常更新模型的其他位置:

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()
if object.tracker.has_changed('date_updated'):

    create_new_object(data)

您可以从中使用
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()
if object.tracker.has_changed('date_updated'):

    create_new_object(data)
您可以签入
save()
或在通常更新模型的其他位置:

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()
if object.tracker.has_changed('date_updated'):

    create_new_object(data)

“不覆盖保存方法”-为什么您有这个要求?您也可以添加您尝试过的代码吗?您是否考虑过使用
post_save
信号?实际上这不是一个要求,我只是尝试覆盖保存方法,我也尝试了信号,以及上面所附链接中的所有可能的解决方案,但是没有成功。Django信号,如
pre_save
post_save
可能有用:“不覆盖save方法”-您为什么有这个要求?您是否也可以添加您尝试过的代码?您是否考虑过使用
post_save
信号?这实际上不是一个要求,我只是试图覆盖save方法,我也尝试了signals,以及上面所附链接中所有可能的解决方案,但没有成功。Django信号,如
pre\u save
post\u save
,可能很有用:您能举一个例子说明如何在我的情况下做到这一点吗?因为到目前为止我已经尝试了很多方法。我能从kwargs这里找到用户吗?你能举一个例子说明如何在我的案例中做到这一点吗?因为到目前为止我尝试了很多东西。我可以从kwargs这里获得用户吗?