Джанго кулинарные рецепты сайта модели структуры - PullRequest
4 голосов
/ 01 февраля 2012

Я работаю на сайте Django, который должен дать возможность выбрать рецепты приготовления, содержащие ингредиенты, предоставленные пользователем. Итак, вкратце, идея сайта - «вещи, которые вы можете приготовить из еды в своем холодильнике».

Итак, я сделал 2 модели

class Recipe (models.Model):
   name = models.CharField(max_length=255)
   ingredients = models.ManyToManyField(Ingredient)

class Ingredient (models.Model):
    name = models.CharField(max_length=255)

Давайте представим, что у меня есть список ['egg','bread','meat','onion'].

Теперь мне нужно выбрать все рецепты, которые можно приготовить из этого списка по ингредиентам. Проблема в том, что некоторые рецепты могут содержать только некоторые ингредиенты из списка.
Например:

  • Яичный тост = яйцо + хлеб
  • тост с мясным яйцом = мясо + яйцо + хлеб
  • мясо с луком = мясо + лук
  • и т. Д. *

Итак, мой вопрос: можно ли выбрать все рецепты, которые можно приготовить, из списка ингредиентов И выбрать самые близкие рецепты, которые можно приготовить, из списка ингредиентов + некоторые ингредиенты из магазина?

Например: рецепты содержат 3 элемента из 4, поэтому мы добавляем их к результату.

Ответы [ 2 ]

3 голосов
/ 01 февраля 2012

Вы пробовали:

Receipt.objects.filter(ingredients__name__in=['egg','bread','meat','onion'])
0 голосов
/ 02 февраля 2012

Я думаю, что нашел одно решение.Используя код

from itertools import chain, combinations
def all_subsets(ss):
    return chain(*map(lambda x: combinations(ss, x), range(0, len(ss)+1)))

, я могу выбрать все возможные комбинации ингредиентов из списков.

for s in all_subsets(['egg','bread','meat','onion']):
    if len(s)>2:
        print s

Дает мне результат

(«яйцо», «хлеб», «мясо») («яйцо», «хлеб», «лук») («яйцо»',' мясо ',' лук ') (' хлеб ',' мясо ',' лук ') (' яйцо ',' хлеб ',' мясо ',' лук ')

Сейчаспроблема в том, как оптимизировать запрос, чтобы я мог выбрать все рецепты, содержащие список этого ингредиента.В MongoDB я использовал

receipts.find({'ingredients.name':{'$all':ingredients_list}})

Есть ли альтернативное решение для MySQL?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...