2009-06-22 3 views
1

django-granular-permissions (http://code.google.com/p/django-granular-permissions/)라는 행 수준 권한 모델을 사용하고 있습니다. 권한 모델에는 단순히 컨텐트 유형과 객체 ID 인 두 개의 필드가 더 있습니다.사용자 정의 선택 필드가 포함 된 Django 모델 쿼리

User.objects.filter(Q(row_permission_set__name='staff') | \ 
    Q(row_permission_set__name='student'), \ 
    row_permission_set__object_id=labsite.id) 

가 나는 결과를 가져올 때 매번 쿼리하지 않고 결과 집합에 is_staffis_student 부울 필드를 추가 할 :

나는 다음과 같은 쿼리를 사용했습니다.

장고 문서는 쿼리 세트의 extra() 메소드를 보여 주지만이 관계로 일반 SQL 선택 쿼리를 작성해야하는 이유를 알 수 없습니다.

어떻게 하시겠습니까?

+0

을 : 당신이 할 수있는 것은 주변의 쿼리를 켭니다? 성능 문제가 있습니까? –

+0

아니요, 위의 쿼리는 완전히 ok입니다. 하지만 내가 원했던 것은'is_staff'와'is_boolean' 추가 필드를 결과 집합 객체에 추가하는 것이 었습니다. – Achimnol

답변

5
.extra(select={'is_staff': "%s.name='staff'" % Permission._meta.db_table, 'is_student': "%s.name='student'" % Permission._meta.db_table, }) 
+0

꽤 잘 작동합니다. :) – Achimnol

+0

나는 실수로 이것을 투표했습니다. 답변이 수정되지 않으면 변경 가능한 시간으로 제한 시간이 지났습니다. 당신이 임의적 인 변경을하면 나는 실수를 바로 잡을 것입니다. 건배! –

0

일반적으로 이와 같은 경우에는 select_related()를 사용하지만 역방향 관계에서는 작동하지 않습니다. 각 쿼리에서이 자격을 포함하여 잘못 무엇

users = [permission.user for permission in Permission.objects.select_related('user').filter(...)] 
+0

귀하의 질의에서 각 사용자의 허가 여부를 어떻게 결정합니까? (특히 템플릿에 대한 편리한 형식) – Achimnol

+0

Permission 객체의 필터 (원하는 사용 권한을 필터링하기 만 함) 때문에 목록의 모든 사용자가 원하는 사용 권한을 갖습니다. 원하는 사용 권한을 가진 사용자를 표시하는 것이 필요한 경우 .extra()보다 간단합니다. * 모든 * 사용자를 나열하고 권한이있는 사용자에게 특정 작업을 수행해야하는 경우 extra()가 필요합니다. – oggy

관련 문제