2014-05-21 2 views
2

특정 사용 권한을 포함하는 장고 모델이 있습니다. 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) 

: 현장 자체가 반복 가능하지 않기 때문에

답변

2

오류가 발생, 당신은 filter 또는 all를 사용하여 검색어 세트를 지정해야 가 저장되므로 예를 들어 post_save 신호를 생성하여이 작업을 수행하거나 save 부모 인스턴스로 호출 한 후보기에 M2M 관계를 저장할 수 있습니다.

+0

실제로 이것은 작동하지 않습니다. super 메소드가 호출되었지만'self.assigned_to.all()'이 비어 있습니다. 그것은 나중에 명시 적으로 user :'assigned_to.add ([users])'를 추가하는 경우에만 작동합니다. Django가 저장 후'ManyToMany'와 관련된 필드를 실제로 추가하기 때문에 이것이 아닙니까? –

+0

네, 맞습니다. 나는 당신의 반복 할 수없는 오류에 응답하고 이것을 간과했다. 나는 대답을 업데이트 할 것이다. – Fiver