Django pre_save信号:如何判断实例是创建还是更新,kwargs['created']是否仍然存在?

41 投票
7 回答
26434 浏览
提问于 2025-04-16 03:31

我正在使用Django的pre_save信号来实现自动添加创建时间。网上有很多关于是否应该自己实现这个功能的讨论。我不想听到关于这个的评论,也不想讨论我是否应该重写保存函数(因为我有很多模型都使用自动添加创建时间,所以使用信号是合理的)。

我的问题是:
我想检查这个实例是被创建还是被更新。根据网上的一些资料,可以通过测试kwargs['created']是否为True来判断。然而,即使这个实例是新创建的,我的kwargs中并没有出现'created'。我只是想知道这个东西是否曾经存在过,或者它是不是神奇地消失了。我知道我也可以测试kwargs['instance'].id是否被设置(这实际上对我有效),但我想知道kwargs['created']是否仍然存在。

7 个回答

25

我不太确定这是不是推荐的方法,不过@Radagast的方法对我没用(不确定是不是因为我用的是自定义的主键)。

我尝试了以下方法(不确定这是不是最好的办法):

@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的作用是什么?

70

主键属性通常是在数据库第一次保存这个实例时自动分配的。所以你可以用类似 if instance.pk is None 这样的代码来检查。

31

根据最新的Django 文档pre_save 并不会发送一个叫 created 的参数。不过,post_save 是会发送的。我找不到任何关于这个信号发送 created 参数的记录,自从 1.0版本以来。

撰写回答