【发布时间】:2017-12-07 18:28:50
【问题描述】:
当用户创建产品时,在调用super(Product,self).save(*args,**kwargs)之前,必须在save()方法中完成多个操作。
我不确定是否应该只使用一个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)
...
所以
@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 可能就足够了,但是还有更复杂的情况,例如为user 创建userprofile 和userplan 等。
对此是否有一些最佳实践建议?你的意见?
【问题讨论】:
-
我会说为了可维护性最好将它们分开。但我通常尽量避免使用信号,而是使用管理器方法等。
标签: python django django-models django-signals