当用户创建产品时,必须先在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
等。
对此有一些最佳做法建议吗?你的意见?
答案 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。
有关更多参考,