Django版本1.10.7,我有一个问题,有时我在ManyToMany字段上的接收m2m_changed
信号为pk_set
为空。
模型m2m部分(注意它是self
参考):
class Profile(TimeStampedModel):
following = models.ManyToManyField(
"self", verbose_name=_("Following"), related_name="followers"
)
使用记录器信号开始部分:
@receiver(m2m_changed, sender=Profile.following.through)
def profile_following_change(sender, instance, action, pk_set, **kwargs):
logger.debug("profile_following_change - sender %s, instance %s, action %s, pk_set %s, kwargs: %s",
sender, instance, action, pk_set, kwargs)
在包含添加的主键的pk_set
的示例日志行下面:
DEBUG:socialhome:profile_following_change -
sender <class 'socialhome.users.models.Profile_following'>,
instance Profile A (profile_a@a.domain.tld),
action post_add,
pk_set {2},
kwargs: {
'signal': <django.db.models.signals.ModelSignal object at 0x7fa73e033908>,
'model': <class 'socialhome.users.models.Profile'>,
'using': 'default',
'reverse': False
}
一个空pk_set
的示例。
DEBUG:socialhome:profile_following_change -
sender <class 'socialhome.users.models.Profile_following'>,
instance Profile B (profile_b@b.domain.tld),
action post_add,
pk_set set(),
kwargs: {
'model': <class 'socialhome.users.models.Profile'>,
'reverse': False,
'using': 'default',
'signal': <django.db.models.signals.ModelSignal object at 0x7f001c173908>
}
这两个保存都来自相同的代码,使用以下行。请注意,此代码在RQ后台进程中运行,如果重要:
profile.following.add(user.profile)
为什么pk_set
有时是空的,有什么想法?请注意,在处理RQ作业之前,两个Profile
对象也存在(通过在UI中执行“跟随”触发事件)。
另外值得注意的是,操作后在ManyToMany字段中找到了添加的对象 。
答案 0 :(得分:0)
旧问题,但是对于那些像我这样通过搜索到达此处的人,当我尝试重新添加已经添加的关系时,例如,添加 Topping 时,我得到了一个空pk_set Pizza (薄饼)上已经有 Topping (薄饼)上的 Pizza 。
通常不会尝试执行此操作,但是正在尝试使信号起作用。希望这可以节省几分钟的时间。