특정 사용 권한을 포함하는 장고 모델이 있습니다. 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
신호를 사용해야합니까? 내가 가장 일반적으로 생각하는 방식은 무엇입니까?
도움을 주시면 감사하겠습니다. 당신이 댓글을 달았습니다,이 상위 모델 인스턴스 후 수행해야 할, 그러나
for user in self.assigned_to.all():
assign_perm('view_project', user, self)
: 현장 자체가 반복 가능하지 않기 때문에
실제로 이것은 작동하지 않습니다. super 메소드가 호출되었지만'self.assigned_to.all()'이 비어 있습니다. 그것은 나중에 명시 적으로 user :'assigned_to.add ([users])'를 추가하는 경우에만 작동합니다. Django가 저장 후'ManyToMany'와 관련된 필드를 실제로 추가하기 때문에 이것이 아닙니까? –
네, 맞습니다. 나는 당신의 반복 할 수없는 오류에 응답하고 이것을 간과했다. 나는 대답을 업데이트 할 것이다. – Fiver