Отфильтруйте набор запросов django, чтобы включить только результаты в данный список - PullRequest
2 голосов
/ 09 января 2012

Итак, я сделал веб-приложение «рецепт» в Django, где у меня есть функция «Кабинет пользователя», в которую пользователь может добавить любой из ингредиентов, и ему будет предложена опция, известная как «Готовые рецепты», в котором приложение будет предлагать пользователю, какие рецепты он сможет приготовить, учитывая ингредиенты своего кабинета. Теперь проблема в том, что если я хочу, чтобы рецепты содержали какие-либо ингредиенты в ящике, я могу сделать это 'Recipe.objects.filter (ингридиенты __ = кабинет_доставки). И если я хочу отфильтровать все ингредиенты в шкафу, я могу сделать:

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

Но если я хочу подмножество ингредиентов шкафа (что имеет больше смысла), чтобы рецепты не содержали ничего вне этих ингредиентов и могли содержать что-либо в этом списке. Например, учитывая 3 ингредиента из шкафа: «foo», «bar», «baz», я должен найти рецепты со следующими результатами:

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

Есть какой-нибудь ключ к этому? Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 09 января 2012

Если у вас есть таблица для ингредиентов, вы можете сделать что-то вроде:

# 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)
0 голосов
/ 09 января 2012

@ cha0site ответ в основном правильный.Однако это приведет к двум запросам к базе данных, в то время как необходим только один.Вместо этого используйте следующий подход:

from django.db.models import Q
Recipe.objects.exclude(~Q(ingredients__name__in=cabinet_ingredients))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...