2

我有一个包含特定权限的 Django 模型。我希望能够将权限分配给assigned_to field. 我django-guardian用来管理权限。

from django.db import models
from django.contrib.auth.models import User
from guardian.shortcuts import assign_perm


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


    permissions = (
        ('view_project', 'View project'),
    )

我试图实现自定义保存方法。如果我在保存之前尝试这样做:

    def save(self, *args, **kwargs):
        for user in self.assigned_to:
             assign_perm('view_project', user, self)
             super(Project, self).save(*args, **kwargs)

我收到一个错误:

    ObjectNotPersisted: Object <project_name> needs to be persisted first

如果我在保存后这样做(无论如何我猜这是错误的):

    def save(self, *args, **kwargs):
        super(Project, self).save(*args, **kwargs)
        for user in self.assigned_to:
             assign_perm('view_project', user, self)

我得到一个Type Error 'ManyRelatedManager' object is not iterable.

我应该post-save为此使用信号吗?对于我认为常见的模式,最好的方法是什么?

4

1 回答 1

2

该错误是由于字段本身不可迭代引起的,您需要使用filteror指定查询集all

for user in self.assigned_to.all():
    assign_perm('view_project', user, self)

但是,正如您所评论的,这需要在保存父模型实例后完成,所以是的,您可以创建一个信号来完成此操作,或者在调用父实例post_save后将 M2M 关系保存在您的视图中。save

于 2014-05-21T01:28:00.960 回答