gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:02:03 27 4
gpt4 key购买 nike

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

我拥有的是一个User对象,它可以在我的代码中以多种不同的方式和位置创建。因此,为了自动为每个 User 分配自定义 Profile 对象,我使用 post_save 信号。但是,在一种特定情况下,我想将额外的信息绑定(bind)到创建的 Profile 对象。将其作为参数传递给 post_save 信号会很棒,但看起来不太可能。

另一个选项是手动创建 Profile 对象,但我需要在保存 User 后创建 Profile 对象,否则 Profile无法绑定(bind)到 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()

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

最佳答案

为什么这对你不起作用?

user = User(...)
user.save()
# profile has been created transparently by post_save event
profile = user.profile
profile.extra_stuff = '...'
profile.save()

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

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

In event:
extra_args = getattr(user, '_evil_extra_args', False)

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

关于django - 是否可以选择性地抑制 Django 中的 post_save (或其他)信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4817800/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com