我正在使用Django的pre_save信号来实现auto_now_add。互联网上有很多关于您为什么应该或不应该自己实施的讨论。我不喜欢对此发表评论。无论我是否应该重写保存功能(我有很多使用auto_now_add的模型,因此使用信号很有意义)。
我的问题是:我想检查实例是否已创建或更新。根据互联网上的一些消息来源,可以通过测试kwargs['created']
是否为True来完成。但是,即使实例是新创建的,'created'
也不会出现在我的kwargs
中。我只是想知道它是否曾经存在过或者它已经神奇消失了。我知道我也可以测试是否设置了kwargs['instance'].id
(实际上对我有用),但是我想知道kwargs ['created']是否仍然存在。
根据最新的Django documentation,pre_save
不发送created
参数。 Post_save
但是does。由于created
,我找不到发送version 1.0的信号的任何参考。
主键属性通常在实例第一次保存时由数据库分配。因此您可以使用if instance.pk is None
我不确定这是否是推荐的方法,但是@Radagast的方法对我不起作用(不确定是否是因为我使用自定义Pk的方法。
我尝试了以下操作(不确定这是否是最佳方法):
@receiver(pre_save, sender=YourModelName, weak=False, )
def presave_payment_model_check(sender, instance=None, created=False, **kwargs):
#Reference: https://stackoverflow.com/questions/11561722/django-what-is-the-role-of-modelstate
if instance._state.adding is True:
# we would need to create the object
print "Creating an object"
else:
#we are updating the object
print "Updating an object"
使用instance._state.adding是最合乎逻辑的方法,因为您将能够知道模型状态是存在还是新的,而不管主键是否已分配。
2020年更新
我不知道从哪个版本开始可以使用,但是您现在可以从与信号一起发送的参数中直接使用created
https://docs.djangoproject.com/en/3.0/ref/signals/#post-save