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这里获得用户吗?