Python 我应该选择一个通用信号而不是多个特定信号吗?
用户创建产品时,在调用Python 我应该选择一个通用信号而不是多个特定信号吗?,python,django,django-models,django-signals,Python,Django,Django Models,Django Signals,用户创建产品时,在调用super(product,self).save(*args,**kwargs)之前,必须在save()方法中执行多个操作 我不确定是否应该只使用一个pre_save信号来执行所有这些操作,还是最好分别为每个操作创建一个信号 简单示例(我将用信号替换save覆盖): SO @receiver(pre_save,sender=Product) def set_attrs(instance,**kwargs): if kwargs['created']:
super(product,self).save(*args,**kwargs)
之前,必须在save()方法中执行多个操作
我不确定是否应该只使用一个pre_save
信号来执行所有这些操作,还是最好分别为每个操作创建一个信号
简单示例(我将用信号替换save
覆盖):
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
可能就足够了,但是有更复杂的情况,比如为user
创建userprofile
,然后创建userplan
等
是否有一些最佳实践建议?你的意见?简单地说,它可以作为一条建议指出
如果一个模型实例上的操作影响到另一个模型,那么信号是最干净的方式。这是一个可以使用信号的示例,因为如果您知道我的意思,您可能希望避免从other\u model
的save()
方法中调用some\u model.save()
为了详细说明一个示例,当重写save()
方法时,常见的任务是从模型中的某些字段创建slug。如果需要在多个模型上执行此过程,则使用pre_save
信号将是一个好处,而不是在每个模型的save()
方法中硬编码
此外,在批量操作中,不一定要调用这些信号和方法
从文件来看
在批量操作上不调用重写的模型方法
请注意,当使用QuerySet批量删除对象或作为级联删除的结果时,不一定要调用对象的delete()方法。为了确保执行定制的删除逻辑,您可以使用pre_delete和/或post_delete信号
不幸的是,在批量创建或更新对象时没有解决方法,因为没有调用save()、pre_save和post_save
作为更多参考
我想说,为了便于维护,最好将它们分开。但我通常尽量避免使用信号,而是使用管理方法等。
@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'