是否有可能选择性地抑制Django中的post_save(或其他)信号?

Her*_*aaf 6 django django-signals

我想知道是否有可能在对象创建时选择性地抑制Django信号(例如post_savepost_init),或者,发送它某些参数.

我所拥有的是一个User对象,可以在我的代码中以多种不同的方式创建.因此,要自动Profile为每个对象分配一个自定义对象User,我使用该post_save信号.但是,在一个特定情况下,我想要绑定到创建的Profile对象的额外信息.将它作为post_save信号的参数传递将是很好的,但它看起来不可能.

另一种选择是手动创建Profile对象,但是在User保存之后我需要这样做,否则Profile无法绑定到User实例.User但是,保存实例会导致Profile通过信号调用的函数创建另一个实例.

而且我不能只获得刚刚创建的Profile对象,因为这会导致'Profile' object is unsubscriptable错误.有什么建议?

更新:

以下是可能情况的示例:

def createUserProfile(sender, instance, created, **kwargs):
if created:  
    profile, created = Profile.objects.get_or_create(user=instance)
    if extra_param:
        profile.extra_param = extra_param
    profile.save()

post_save.connect(createUserProfile, sender=User)

def signup(request):
   ...
   extra_param = 'param'
   user.save()
Run Code Online (Sandbox Code Playgroud)

如何extra_paramsignup方法中的变量获取到createUserProfile方法,在该方法中将变量存储为Profile对象的一部分?

Ski*_*Ski 1

为什么这对你不起作用?

user = User(...)
user.save()
# profile has been created transparently by post_save event
profile = user.profile
profile.extra_stuff = '...'
profile.save()
Run Code Online (Sandbox Code Playgroud)

如果您痴迷于传递给事件的参数,这可能是但邪恶的:

user = User()
user._evil_extra_args = { ... }
user.save()

In event:
extra_args = getattr(user, '_evil_extra_args', False)
Run Code Online (Sandbox Code Playgroud)

这是邪恶的,因为阅读你代码的人将不知道这些 _evil_extra_args 到底是做什么用的以及它是如何工作的。

  • 我最终选择了邪恶的选项,因为第一个选项给出了某种并发错误(当我尝试访问配置文件时,数据库对象仍然被“save()”事件锁定)。 (3认同)