Django version 1.10.7, I have a problem where sometimes my receiving m2m_changed
signal on a ManyToMany field has pk_set
empty.
The model m2m part (note it's a self
reference):
class Profile(TimeStampedModel):
following = models.ManyToManyField(
"self", verbose_name=_("Following"), related_name="followers"
)
Signal beginning part with logger:
@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)
Below an example log line with pk_set
containing the added primary key:
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
}
And an example with an empty 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>
}
The two saves are both from the same code, using the following line. Note this code runs in an RQ background process, should that matter:
profile.following.add(user.profile)
Why is the pk_set
sometimes empty, any ideas? Note that both Profile
objects also exist before the RQ job is processed (event is triggered by doing a "follow" in the UI).
Also of note, added object is found in the ManyToMany field after the operation.