Джанго предоставляет разрешения на / после сохранения объекта

У меня есть модель 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 сигнал для этого? Каков наилучший подход для того, что я предполагаю, является общей моделью?

1 ответ

Решение

Ошибка вызвана тем, что само поле не повторяется, вам нужно указать набор запросов, используя filter или же all:

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

Однако, как вы прокомментировали, это необходимо сделать после сохранения экземпляра родительской модели, так что да, вы можете создать post_save сигнал для достижения этого или сохранить отношения M2M в вашем представлении после вашего звонка save родительский экземпляр.

Другие вопросы по тегам