2012-03-15 3 views
0

나는 ItemAdmin 내장고 ManyToManyField에 대한 Queryset 필터?

def queryset(self, request): 

를 재정 의하여 결과를 제한하기 위해 노력하고있어.

사용자 프로필을 통해 request.user에 범주 액세스 권한이 부여 된 항목 만 표시하려고합니다.

class Profile(models.Model): 
    user = models.ForeignKey(auth.User, unique=True) 
    categoryAccess = models.ManyToManyField(Category ...) 

class Item(models.Model): 
    category = models.ForeignKey(Category ...) 

내가 꽤 구문 오른쪽 .... 나는

class ItemAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(ItemAdmin, self).queryset(request) 
     return qs.filter(category__in=request.user.objects__profile__categoryAccess) 

어떤 아이디어가 같은 것들을 시도하고 얻을 수없는 이유는 무엇입니까? 고마워요!

답변

2

필터의 이중 밑줄 구문은 표현식의 왼쪽에서만 사용됩니다 (실제로 함수에 대한 키워드 인수이고 표현식이 될 수 없다는 사실을 알기 쉽게 해킹 해줍니다) . 당신은 마이그레이션 할 필요가 없습니다 (A OneToOneFielduser 외래 키를 변환해야이 일을 할

return qs.filter(category__in=request.user.profile.categoryAccess.all()) 

참고 : . 그래서 아마 당신이 원하는 : 오른쪽은 물체를 통과 할 수있는 일반 구문을 사용합니다 데이터베이스, 그냥 모델 정의를 변경).

+0

안녕 다니엘! 고마워요 ... 필드를 OneToOne로 변경했지만 '일치하는 프로필이 존재하지 않습니다'라는 메시지가 나타납니다. – cssndrx

+0

오, 아! 그것은 실제로 나쁘다. 사용자가 만든 프로필이 없기 때문에 코드가 손상되었습니다. 그 예외를 잡아서 빈 목록을 반환하는 것이 괜찮습니까? 수정 주셔서 감사합니다 :) – cssndrx

+1

그냥 확인 ... 뒤로 관계 user.profile, 맞 죠? 문서에서 __ 구문을 사용하여 관계가 가능하다는 것을 알았습니다. 그러나 프로필을 만든 다음 필터를 적용하려고 할 때 : 비 전통적인 장고 오류가 발생합니다. "데이터베이스 오류 : 데이터베이스 설치에 문제가 있습니다. 적절한 데이터베이스 테이블이 만들어 졌는지 확인하고 적절한 사용자가 데이터베이스를 읽을 수 있는지 확인하십시오." 이걸 본 사람 있어요? – cssndrx