Django 烹饪食谱网站模型结构

5 投票
2 回答
2420 浏览
提问于 2025-04-17 12:07

我正在做一个Django网站,目的是让用户可以选择包含他们提供的食材的烹饪食谱。简单来说,这个网站的想法就是“你可以用冰箱里的食材做些什么”。

所以我创建了两个模型。

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

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

假设我有一个列表 ['鸡蛋','面包','肉','洋葱']

现在我需要从这个食材列表中选择所有可以做的食谱。问题是,有些食谱可能只包含列表中的部分食材。
举个例子:

  • 鸡蛋吐司 = 鸡蛋 + 面包
  • 肉蛋吐司 = 肉 + 鸡蛋 + 面包
  • 肉洋葱 = 肉 + 洋葱
  • 等等...

所以我的问题是:是否可以选择出所有可以用这个食材列表做的食谱,并且选择出那些可以用这个食材列表加上商店里的一些食材做的最接近的食谱?

举个例子:如果一个食谱有4个食材中的3个,那我们就把它加到结果里。

2 个回答

3

你试过这个吗:

Receipt.objects.filter(ingredients__name__in=['egg','bread','meat','onion'])
0

我想我找到了解决办法。使用下面的代码

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中使用?

撰写回答