2012-01-09 2 views
2

장고에서 "recipe"웹 응용 프로그램을 만들었습니다. 장고에서는 사용자가 구성 요소를 추가 할 수있는 "사용자 캐비닛"이라는 기능이 있습니다. 'Makeable recipes'로 알려진 옵션이 제공됩니다.이 옵션에서는 사용자가 캐비닛의 재료를 사용하여 어떤 조리법을 만들 수 있는지 사용자에게 제안합니다. 이제 문제는 요리법에 캐비닛에있는 재료 중 하나를 포함하고 싶다면 '내가 할 수있는 요리법'. objects.info (캐비닛 _ 재료). 나는 캐비닛에 모든 재료를 필터링 할 경우에, 내가 할 수있는 :django queryset은 지정된 목록에 결과 만 포함합니다.

qs = Recipe.objects.annotate(count=Count('ingredients'))\ 
       .filter(count=len(cabinet_ingredients)) 
for ingredient in cabinet_ingredients: 
    qs = qs.filter(ingredients=ingredient) 

을하지만 난 캐비닛 성분 (어느 것이 더 의미)의 하위 집합을 원하는 경우 조리법 외부 아무것도 포함하지해야한다는 등 이 목록에는 무엇이든 들어있을 수 있습니다.

Recipes with 3 ingredients: 
('foo', 'bar', 'baz') 
Recipes with 2 ingredients: 
('foo', 'bar'), 
('foo', 'baz'), 
('bar', 'baz') 
Recipes with single ingredient: 
('foo') 
('bar') 
('baz') 

이에 대한 모든 단서 예를 들어 나는 다음과 같은 결과로 조리법을 찾기 위해, '갑', '바', '바즈'을 3 개 캐비닛 성분이 주어진? 미리 감사드립니다. cha0site의 대답은 대부분 정확 @

# ingredients _not_ in the cabinet 
inner_qs = Ingredient.objects.exclude(name__in = cabinet_ingredients) 
# recipes that do not contain an ingredient that is _not_ in the cabinet 
qs = Recipe.objects.exclude(ingredients__in = inner_qs) 

답변

3

당신이 성분에 대한 테이블이 한 가정, 당신은 뭔가를 할 수 있습니다. 그러나 데이터베이스에 대한 두 개의 쿼리가 필요하지만 단 하나만 필요합니다. 대신 다음 방법을 사용하십시오.

from django.db.models import Q 
Recipe.objects.exclude(~Q(ingredients__name__in=cabinet_ingredients)) 
+0

감사합니다. 매력처럼 작동합니다. – tejinderss

+0

굉장! 부록으로, [in in field lookup documentation] (https://docs.djangoproject.com/en/1.3/ref/models/querysets/#in), 특히 _Performance_ _considerations_ 섹션을 읽으십시오. 바닥. – cha0site

0

:

+0

안녕하세요, 문서에 따르면, 데이터베이스에서 최적화 할 수있는 중첩 된 쿼리가 발생합니다. 나는 Q 객체를 사용하는 것을 고려했으나 원래의'Recipe.objects.filter (ingredients__in = cabinet_ingredients)'와 정확히 같지 않습니까? 아니면 논리에서 뭔가를 놓치고 있습니까? – cha0site

+0

Django는 동일한 요청에서 외부 쿼리와 함께 내부 쿼리를 보낼 수 있습니다. 그렇다면 두 방법 모두 효율적일 수 있습니다. 그러나 '필터'는 실제로 다릅니다. 귀하의 버전과 광산으로, 우리는 명시 적으로 그 목록에없는 항목을 제외하고있는 반면, 귀하의 의견에있는 '필터'는 단지 그 목록에 1000 가지의 다른 성분을 가지고 있는지 여부에 관계없이 그 성분을 포함하는 것을 포함 할뿐입니다. –

+0

나는이 방법이 cha0site에 의해 게시 된 것과 다른 바람직하지 않은 결과를 나타내는 이유를 알지 못한다. – tejinderss

관련 문제