29

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

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

4

5 回答 5

56

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

于 2012-08-26T17:32:50.313 回答
23

根据最新的 Django文档pre_save不发送created参数。Post_save然而确实如此created1.0 版以来,我找不到任何关于信号发送的参考。

于 2010-08-31T09:20:24.093 回答
21

我不确定这是否是推荐的方法,但@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:
        # we would need to create the object
        print "Creating an object"
    else:
        #we are updating the object
        print "Updating an object"
    

参考:Django:ModelState的作用是什么?

于 2015-07-29T09:22:18.710 回答
8

您可以通过以下方式轻松检查实例是否在 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 测试。

于 2020-04-21T21:46:03.390 回答
3

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

于 2015-10-03T04:32:40.350 回答