4

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.

jaywink
  • 280
  • 3
  • 14

1 Answers1

2

Old question, but for those who get here through search like me, I got an empty pk_set when I was trying to re-add a relationship that was already added, for example, adding a Topping to a Pizza when the Topping was already on the Pizza.

Wouldn't usually try to do that, but was trying to get the signal to work. Hope this saves someone a few minutes of head-scratching.

Vercingatorix
  • 1,838
  • 1
  • 13
  • 22