2012-09-29 2 views
11

필터 집합을 사용하여 데이터베이스에서 여러 행을 검색하고 싶습니다.django 조건부 필터링 객체

조건부 필터가 django에 적용되는지 궁금합니다. 즉, "변수가 없으면 필터, 그렇지 않으면 필터링 적용 안 함"입니다. 이 같은

뭔가 : 내가 뭘하고 싶은 카테고리가 없음되지없는 경우에만 카테고리 필터를 적용입니다

user = User.objects.get(pk=1) 
category = Category.objects.get(pk=1) 
todays_items = Item.objects.filter(user=user, date=now()).conditional_filter(category=category)) 

.

범주가 없음 (요청 개체에 지정되지 않았 음을 의미) 인 경우이 필터는 전혀 적용되지 않습니다. 이것은 나를 'if-elif-else'상황의 무리로 만들어 줄 것이다.

이 방법이 있습니까?

답변

15

할 수 있습니다 체인 쿼리 :

user = User.objects.get(pk=1) 
category = Category.objects.get(pk=1) 
qs = Item.objects.filter(user=user, date=now()) 
if category: 
    qs = qs.filter(category=category) 

의 검색어가 느리게 실행되기 때문에이 항목을 표시 할 때, DB 히트에만 발생합니다.

2

문제에 대한 몇 가지 접근 방법이 있습니다. 한 가지 방법은이 예제를 쉽게 자신의 쿼리를 작성할 수 있습니다, 이것이 당신이 찾고있는 쿼리가 있다면 내가 바로 당신의 대답에 이해가 안 Complex lookups with Q objects

from django.db.models import Q 

user = User.objects.get(pk=1) 
category = Category.objects.get(pk=1) 

f1 = Q(user=user, date=now()) 
f_cat_is_none = Q(category__isnull = True) 
f_cat_is_not_none = Q(category=category) 

todays_items = Item.objects.filter(f1 & (f_cat_is_none | f_cat_is_not_none)) 

으로 재생하는 것입니다,하지만.

category__isnull == True

편집으로 인해 영업 이익의 의견은 데이터베이스에 항목이 관련 카테고리를하지 않은 것을 의미한다. 아마도 당신이 찾고있는 쿼리는 다음과 같습니다

from django.db.models import Q 

user_pk = 1 
category_pk = 1 #some times None 

f = Q(user__pk = user_pk, date=now()) 
if category_pk is not None: 
    f &= Q(category__pk = category_pk) 

todays_items = Item.objects.filter(f ) 

이 사용자의 요구 사항에 맞게 만 코드 샘플입니다. 싱글 _과 더블 __을 조심하십시오.

+0

감사합니다. 제가 이해하지 못하는 것은'category__isnull = True'입니다. 내 개체에 해당 범주 필드에 NULL이 없습니다. 항상 틀린 것입니다. – xpanta

+0

@ xpanta, 대답에 설명했다. – danihp

+0

@danihp, 죄송합니다. 여전히 __isnull = True를 이해하지 못했습니다. 이 상황에 적용됩니까? "카테고리"가 포함 된 양식, 사용자가 양식을 채우고 제출합니다. 사용자가 "범주"를 입력하지 않으면이 값은 ""입니다. 그런 다음 첫 번째 예제를 따르면 "범주"의 제약 조건없이 데이터베이스를 필터링 할 수 있습니까? 제 이해가 정확하다면 제게 정정하십시오. 미리 감사드립니다. –

4

음이 오히려 오래된 질문이지만, 한 줄에 조건부 필터링을 수행하고자하는 사람들을 위해, 여기에 (, BTW 다음 코드는 아마 더 일반적인 방식으로 작성 될 수있다) 나의 접근 방식 :

시청해야 할 것은 user=user과 같은 키워드 인수 앞에 conditional_category_filter(category) 호출을 사용하는 것입니다. 예를 들어, 다음 코드는 오류를 던질 것입니다 :

todays_items = Item.objects.filter(user=user, date=now(), conditional_category_filter(category))