Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我应该选择一个通用信号而不是多个特定信号吗?_Python_Django_Django Models_Django Signals - Fatal编程技术网

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'