我应该更喜欢一个通用信号而不是多个特定信号吗?

时间:2017-07-04 10:21:08

标签: python django django-models django-signals

当用户创建产品时,必须先在save()方法中执行多项操作,然后才能调用super(Product,self).save(*args,**kwargs)

我不确定是否应该只使用一个pre_save信号来执行所有这些操作,或者最好分别为每个操作创建一个信号。

简单示例(我将用信号替换save覆盖):

class Product(..):
    def save(...):
        if not self.pk:
            if not self.category:
                self.category = Category.get_default()
            if not self.brand:
                self.brand = 'NA'
        super(Product,self).save(*args,**kwargs)
        ...

SO

@receiver(pre_save,sender=Product)
def set_attrs(instance,**kwargs):
    if kwargs['created']:
        instance.category = Category.get_default()
        instance.brand = 'NA'

@receiver(pre_save,sender=Product)
def set_category(instance,**kwargs):
    if kwargs['created']:
        instance.category = Category.get_default()

@receiver(pre_save,sender=Product)
def set_brand(instance,**kwargs):
    if kwargs['created']:
        instance.brand = 'NA'

这只是一个简单的例子。在这种情况下,一般set_attrs应该足够了,但是有更复杂的情况有不同的操作,例如为userprofile创建user然后userplan等。

对此有一些最佳做法建议吗?你的意见?

1 个答案:

答案 0 :(得分:0)

简单地说出事实,可以指出它是一条单一的建议,

如果对一个模型实例的操作影响另一个模型,则信号是最干净的方式。这是一个可以使用信号的示例,因为如果您知道我的意思,您可能希望避免some_model.save() save() another_model方法中的save()来电。

详细说明一个例子,当重写pre_save方法时,常见的任务是从模型中的某些字段创建slug。如果您需要在多个模型上实现此过程,那么使用save()信号将是一个好处,而不是在每个模型的<action android:name="android.intent.action.NEW_OUTGOING_CALL" />方法中进行硬编码。

此外,在批量操作中,不一定要调用这些信号和方法。

来自文档,

  

批量操作不会调用重写的模型方法

     

请注意,在使用QuerySet批量删除对象或作为级联删除的结果时,不一定要调用对象的delete()方法。为确保执行自定义删除逻辑,您可以使用pre_delete和/或post_delete信号。

     

不幸的是,在批量创建或更新对象时没有解决方法,因为没有调用save(),pre_save和post_save。

有关更多参考,