我正在使用Django的pre_save信号来实现auto_now_add。在互联网上有很多关于为什么你应该或不应该自己实现它的讨论。我不喜欢对此的评论。也不喜欢我是否应该重写save函数(我有很多模型使用auto_now_add,所以使用信号是有意义的)。
我的问题是:
我想检查示例是否已创建或更新。根据Internet上的一些消息来源,这可以通过测试kwargs['created']
是否为True来完成。但是,即使示例是新创建的,'created'
也不会出现在我的kwargs
中。我只是想知道它是否曾经存在过,或者它是否神奇地消失了。我知道我还可以测试是否设置了kwargs['instance'].id
(事实上这对我很有效),但我想知道kwargs("创造")是否仍然存在。
7条答案
按热度按时间beq87vna1#
主键属性,通常在示例第一次保存时由数据库分配。因此,可以使用类似
if instance.pk is None
的属性ahy6op9u2#
根据最新的Django文档,
pre_save
不发送created
参数。但是Post_save
发送。我找不到任何从1.0版本开始发送created
的信号的参考。o0lyfsai3#
我不确定这是否是推荐的方式,但@Radagast的方法对我不起作用(不确定是否是因为我使用自定义PK)。
我尝试了以下方法(不确定这是否是最好的方法):
参考:Django : What is the role of ModelState?
unftdfkk4#
您可以通过以下方式轻松检查是否在pre_保存**中创建或更新了示例:
使用Django 3.0测试。
gpnt7bae5#
使用instance._state.adding是最合乎逻辑的方法,因为无论主键是否已被分配,您都能够分辨出模型状态是存在还是新的。
dldeef676#
你可以试试这个。
1qczuiv07#
当pk是自定义uuid字段时,instance.pk在创建时也会有值。