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