Django pre_save信号:检查实例创建是否未更新,kwargs ['created'](仍然存在)吗?

问题描述 投票:21回答:5

我正在使用Django的pre_save信号来实现auto_now_add。互联网上有很多关于您为什么应该或不应该自己实施的讨论。我不喜欢对此发表评论。无论我是否应该重写保存功能(我有很多使用auto_now_add的模型,因此使用信号很有意义)。

我的问题是:我想检查实例是否已创建或更新。根据互联网上的一些消息来源,可以通过测试kwargs['created']是否为True来完成。但是,即使实例是新创建的,'created'也不会出现在我的kwargs中。我只是想知道它是否曾经存在过或者它已经神奇消失了。我知道我也可以测试是否设置了kwargs['instance'].id(实际上对我有用),但是我想知道kwargs ['created']是否仍然存在。

python django kwargs
5个回答
19
投票

根据最新的Django documentationpre_save不发送created参数。 Post_save但是does。由于created,我找不到发送version 1.0的信号的任何参考。


39
投票

主键属性通常在实例第一次保存时由数据库分配。因此您可以使用if instance.pk is None

之类的东西

16
投票

我不确定这是否是推荐的方法,但是@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"

参考:Django : What is the role of ModelState?


2
投票

使用instance._state.adding是最合乎逻辑的方法,因为您将能够知道模型状态是存在还是新的,而不管主键是否已分配。


0
投票

2020年更新

我不知道从哪个版本开始可以使用,但是您现在可以从与信号一起发送的参数中直接使用created

https://docs.djangoproject.com/en/3.0/ref/signals/#post-save

© www.soinside.com 2019 - 2024. All rights reserved.