保存后信号与关系

2024-09-30 00:28:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我应用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')

保存项目时的时间线如下:

  1. 在项目.保存()
  2. 每sonProjectMembership.save()

所以很正常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}


Tags: 项目name模型project信号modelssave员工
2条回答

您可能知道,许多关系是通过附加表存储的,该表包含关系两端的主键。因此,保存具有多个关系的模型实例需要两个步骤:

  1. 首先,实例被保存:在数据库中创建新记录,实例接收它的主键。post_save此时被激发。

  2. 然后,保存关系:创建关系表中的记录。m2m-changed信号此时被触发。

换句话说,当post_save被触发时,m2m关系还没有被处理。在

您可以查看文档:m2m-changed

在对我的代码进行了大量的挖掘和简单的测试之后,我按照克拉斯诺佩罗夫的建议尝试了m2m_的改变信号。我意识到,如果您显式地声明一个“through”模型(在我的例子中是“PersonProjectMembership”),这个信号就不能很好地工作。在

然后我又想了想,把我的方法与“PersonProjectMembership”的post_save信号联系起来。那很好用。在

相关问题 更多 >

    热门问题