Django pre_save信号:如何判断实例是创建还是更新,kwargs['created']是否仍然存在?
我正在使用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"
70
主键属性通常是在数据库第一次保存这个实例时自动分配的。所以你可以用类似 if instance.pk is None
这样的代码来检查。