一尘不染

Django从post_save信号访问ManyToMany字段

django

我有一个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()))

在这种情况下,当创建一个Project时,信号将触发,并且我看到title,但是该assigned_to字段为空列表。

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


阅读 543

收藏
2020-03-27

共1个答案

一尘不染

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

解决方案是插入m2m_changed信号而不是post_save

2020-03-27