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

时间:2010-08-31 09:09:47

标签: python django kwargs

我正在使用Django的pre_save信号来实现auto_now_add。互联网上有很多关于为什么你应该或不应该自己实现它的讨论。我不赞赏对此的评论。我是否应该重写保存功能(我有很多使用auto_now_add的模型,所以使用信号是有意义的)。

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

6 个答案:

答案 0 :(得分:34)

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

这样的东西

答案 1 :(得分:20)

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

答案 2 :(得分:12)

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

答案 3 :(得分:5)

您可以通过以下方式轻松地检查实例是否是在pre_save 中创建或更新的:

@receiver(pre_save, sender=MyModel)
def pre_save_user(sender, instance, **kwargs): 
    if instance._state.adding:
        print ('Instance created!')
    else:
        print ('Instance updated!')

经过Django 3.0的测试。

答案 4 :(得分:1)

使用instance._state.adding是最合乎逻辑的方法,因为无论主键是否已分配,您都可以告诉模型状态是否存在或是新的。

答案 5 :(得分:-1)

更新2020

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

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