horse
horse

Reputation: 501

Get Related Model From M2M Intermediate Model

In signals.py I am catching @receiver(m2m_changed, sender=Manager.employees.through).

This is getting the signal sent when a m2m relationship is created between a Manager and an Employee.

I am trying to get the Employee that this particular relationship is referencing.

I am guessing sender is the 'through' relationship object, but really I'm not sure.

If I print(sender) I get <class 'users.models.Manager_employees'>.

I have tried referenced_employee = sender.employee_id, but this gives me <django.db.models.fields.related_descriptors.ForeignKeyDeferredAttribute object at 0x03616310>.

print(sender['employee_id']) gives me 'ModelBase' object is not subscriptable.

print(sender.employee_id) gives me an error 'ModelBase' object is not subscriptable.

I'm really just trying everything I can think of at this point.

Thank you.

Upvotes: 0

Views: 128

Answers (1)

fixmycode
fixmycode

Reputation: 8506

Like sender, the signal also pass other arguments.

@receiver(m2m_changed, sender=Manager.employees.through)
def my_signal_receiver(sender, **kwargs):
    # kwargs is a dictionary
    for key, value in kwargs.items():
        print(key, value)

Take the following example:

an_employee = Employee.objects.create(name='Brenden')
my_manager.employees.add(an_employee)

You will have the following items in the dictionary:

kwargs['instance'] is the instance of the model being changed. In the example above, it will be my_manager

kwargs['model'] is the class being added. In this case Employee and

kwargs['pk_set'] will be {an_employee.id,}, a set of the keys being added, so you could do something like

my_employee = kwargs['model'].objects.get(id=kwargs['pk_set'][0])

Upvotes: 1

Related Questions