我应用post_save信号来应用每个对象的用户权限,然后相应地过滤查询集。在
我的模型是这样的:
class Project(models.Model):
# Relations with other entities.
employees = models.ManyToManyField('staff.Person', through='project.PersonProjectMembership',
related_name='projects')
research_groups = models.ManyToManyField('group.Group', related_name='projects',
through='project.ProjectGroupMembership')
departments = models.ManyToManyField('department.Department', related_name='projects',
through='project.ProjectDepartmentMembership')
问题是:当我捕捉到保存后的信号时,虽然我已经为部门、研究小组和员工输入了值,但它们似乎总是空的。我有什么遗漏吗?在
更新:在当前代码下面,它尚未按预期工作。我已经更改了m2m的后保存。在
^{pr2}$解决方案
在我的项目模型中,我明确地将PersonProjectMembership定义为m2m关系员工中的中间模型:
class Project(models.Model):
# Relations with other entities.
employees = models.ManyToManyField('staff.Person', through='project.PersonProjectMembership', related_name='projects')
保存项目时的时间线如下:
所以很正常Project.post_保存员工仍然是空的。我要做的就是听PersonProjectMembership post_save信号:
@receiver(post_save, sender=PersonProjectMembership)
def my_listener(**kwargs):
# do stuff [...]
查看https://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.ManyToManyField.through和{a2}
您可能知道,许多关系是通过附加表存储的,该表包含关系两端的主键。因此,保存具有多个关系的模型实例需要两个步骤:
首先,实例被保存:在数据库中创建新记录,实例接收它的主键。
post_save
此时被激发。然后,保存关系:创建关系表中的记录。
m2m-changed
信号此时被触发。换句话说,当
post_save
被触发时,m2m关系还没有被处理。在您可以查看文档:m2m-changed
在对我的代码进行了大量的挖掘和简单的测试之后,我按照克拉斯诺佩罗夫的建议尝试了m2m_的改变信号。我意识到,如果您显式地声明一个“through”模型(在我的例子中是“PersonProjectMembership”),这个信号就不能很好地工作。在
然后我又想了想,把我的方法与“PersonProjectMembership”的post_save信号联系起来。那很好用。在
相关问题 更多 >
编程相关推荐