Django 从 post_save 信号访问 ManyToMany 字段

标签 django django-models django-signals

我有一个 Django 模型,我想在保存时或保存后立即修改对象权限。我尝试了一些解决方案,post_save 信号似乎是我想做的事情的最佳选择:

    class Project(models.Model):
        title = models.CharField(max_length=755, default='default')
        assigned_to = models.ManyToManyField(
            User, default=None, blank=True, null=True
        )
        created_by = models.ForeignKey(
            User,
            related_name="%(app_label)s_%(class)s_related"
        )


    @receiver(post_save, sender=Project)
    def assign_project_perms(sender, instance, **kwargs):
        print("instance title: "+str(instance.title))
        print("instance assigned_to: "+str(instance.assigned_to.all()))

在这种情况下,当一个项目被创建时,信号被触发并且我看到了 title,但是 assigned_to 字段的列表是空的。

如何在保存后访问保存的 assigned_to 数据?

最佳答案

你不会的。 M2M 是在保存实例后保存的,因此所有的 m2m 更新都不会有任何记录。进一步的问题(即使您解决了该问题)是您仍在事务中并且无论如何查询数据库都不会使您的 m2m 具有正确的状态。

解决方案是挂接到 m2m_changed 信号而不是 post_save

https://docs.djangoproject.com/en/dev/ref/signals/#m2m-changed

然后您的发件人将是 Project.assigned_to.through

关于Django 从 post_save 信号访问 ManyToMany 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23795811/

相关文章:

Django 信号 - kwargs ['update_fields' ] 在通过 django admin 进行模型更新时始终为 None

python - 如何使用 apache2 和 mod_wsgi 获取 Django 调试页面

python - Django 应用程序是否有保留/非法名称?导入/makemigrations 无法根据应用程序名称进行工作

python - Django 在单个查询集中组合外键

django - 在 Django 中动态地从对象 _meta 获取外键的详细名称

python - 使用 Django 模型的 post_save 进行手动缓存失效 : do foreign keys trigger save()?

python - django计数注释字段

python - 在 models.py : Django rest framwork 中导入序列化器

Django Photologue 上传照片示例

django - 如何知道 Django 中的数据库何时准备就绪?