我想知道是否有可能在对象创建时有选择地抑制Django信号(例如post_save
或post_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()
如何将extra_param
方法中的变量signup
添加到createUserProfile方法中,将其作为Profile
对象的一部分存储?
答案 0 :(得分:2)
为什么这对你不起作用?
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是什么,以及它是如何工作的。
答案 1 :(得分:0)
延迟post_save
是不可能的(除非你想entirely disconnect it),但两者都没有必要。将参数传递给配置文件根本不是问题:
class UserProfile(models.Model):
user = models.ForeignKey(User)
other = models.SomeField()
def create_user_profile(sender, instance, created, other_param=None, **kwargs):
if created:
profile, created = UserProfile.objects.get_or_create(user=instance)
profile.other(other_param) # or whatever
profile.save()
post_save.connect(create_user_profile, sender=User, other_param=p)