Django m2m_changed pk_set为空

时间:2017-06-10 20:48:31

标签: django signals manytomanyfield

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字段中找到了添加的对象

1 个答案:

答案 0 :(得分:0)

旧问题,但是对于那些像我这样通过搜索到达此处的人,当我尝试重新添加已经添加的关系时,例如,添加 Topping 时,我得到了一个空pk_set Pizza (薄饼)上已经有 Topping (薄饼)上的 Pizza

通常不会尝试执行此操作,但是正在尝试使信号起作用。希望这可以节省几分钟的时间。