I use the post_save signal to apply user rights for each object, and then filter the request accordingly.
My model looks like this:
class Project(models.Model):
The problem is this: when I catch a signal after saving, although I have entered values โโfor departments, research groups, and employees, they always appear empty. Is there something I missed?
Update: below the current code, which is not working properly so far. I changed post_save to m2m_changed.
from django.db.models.signals import m2m_changed from django.db import models from django.dispatch.dispatcher import receiver class Project(models.Model): employees = models.ManyToManyField('staff.Person', through='project.PersonProjectMembership', related_name='projects') class PersonProjectMembership(models.Model): project = models.ForeignKey('project.Project', related_name="person_memberships") person = models.ForeignKey('staff.Person', related_name="project_memberships") lead = models.BooleanField(default=False) position = models.CharField(max_length=50) project_manager = models.BooleanField( default=False ) class Meta: permissions = ( ('view_personprojectmembership', _('View person project membership')), ) @receiver(m2m_changed, sender=Project.employees.through) def _on_save_project_assign_privileges(sender, instance, action, reverse, model, pk_set, using, **kwargs):
DECISION
In my project model, I explicitly define PersonProjectMembership as an intermediate model in m2m relationships:
class Project(models.Model):
The timeline when saving the project is as follows:
- Project.save ()
- PersonProjectMembership.save ()
So, it's normal that Project.post_save employees are still empty. I needed to listen to the post_save PersonProjectMembership message:
@receiver(post_save, sender=PersonProjectMembership) def my_listener(**kwargs):
Take a look at https://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.ManyToManyField.through and https://docs.djangoproject.com/en/1.9/topics/signals/