Django预保存信号(_S):检查示例是否已创建而未更新,kwargs ['已创建'](仍)存在吗?

vltsax25  于 2022-12-24  发布在  Go
关注(0)|答案(7)|浏览(132)

我正在使用Django的pre_save信号来实现auto_now_add。在互联网上有很多关于为什么你应该或不应该自己实现它的讨论。我不喜欢对此的评论。也不喜欢我是否应该重写save函数(我有很多模型使用auto_now_add,所以使用信号是有意义的)。
我的问题是:
我想检查示例是否已创建或更新。根据Internet上的一些消息来源,这可以通过测试kwargs['created']是否为True来完成。但是,即使示例是新创建的,'created'也不会出现在我的kwargs中。我只是想知道它是否曾经存在过,或者它是否神奇地消失了。我知道我还可以测试是否设置了kwargs['instance'].id(事实上这对我很有效),但我想知道kwargs("创造")是否仍然存在。

beq87vna

beq87vna1#

主键属性,通常在示例第一次保存时由数据库分配。因此,可以使用类似if instance.pk is None的属性

ahy6op9u

ahy6op9u2#

根据最新的Django文档,pre_save不发送created参数。但是Post_save发送。我找不到任何从1.0版本开始发送created的信号的参考。

o0lyfsai

o0lyfsai3#

我不确定这是否是推荐的方式,但@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 : What is the role of ModelState?

unftdfkk

unftdfkk4#

您可以通过以下方式轻松检查是否在pre_保存**中创建或更新了示例:

@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测试。

gpnt7bae

gpnt7bae5#

使用instance._state.adding是最合乎逻辑的方法,因为无论主键是否已被分配,您都能够分辨出模型状态是存在还是新的。

dldeef67

dldeef676#

你可以试试这个。

@receiver(pre_save, sender=User)
def user(instance, *args, **kwargs):
    if instance.id != None:
1qczuiv0

1qczuiv07#

当pk是自定义uuid字段时,instance.pk在创建时也会有值。

相关问题