从 Django 信号转移到保存覆盖:如何将 Django post_save 信号的“created”参数转换为保存方法覆盖

问题描述 投票:0回答:1

我之前就如何处理 Django 模型上的 post_save 事件做出了一些错误的决定,目前我正在考虑改变我的方法。

让我们首先举个例子。这是我的模型。

class MyModel(models.Model):
    #... all my model creation and logic are here
    
    def do_something(self):
        # Actually do something, for the sake of simplifying the example, just write pass
        pass

现在,我使用的是像这样的接收器函数。它有效,但由于我的许多原因,我想在这种情况下停止使用信号。

@receiver(post_save, sender=MyModel)
def foo(sender, instance, created, **kwargs):
    if created:
        instance.do_something()

我想我可以重写

MyModel.save
方法,如下所示:

class MyModel(models.Model):
    #... 

    def save(self):
        super().save()
        if created: # It is this line that I need to figure how to do. 
            self.do_something()

如果我想重写

if created:
方法,我应该用什么替换接收器函数的
save()
?或者还有什么可以推荐的吗?

我也很好奇

pre_save
信号是否也是一样。

python django django-models django-signals
1个回答
0
投票

如果我理解你的问题,你可以尝试检查当前模型实例 pk 是否可用

def save(self, *args, **kwargs):
        is_created = self.pk is None  # Check if the instance is being created

        super().save(*args, **kwargs)

        if is_created:
            self.do_something()
© www.soinside.com 2019 - 2024. All rights reserved.