我正在研究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)
让我们想象一下,我有['egg','bread','meat','onion']
列表。
现在我需要选择可以从成分列表中制作的所有食谱。 问题是,有些食谱可能只含有列表中的一些成分 例如:
所以我的问题是:是否可以选择所有可以从成分列表中制作的食谱,并从成分列表中选择最接近的食谱+来自商店的一些成分?
例如:食谱有4个元素,因此我们将其添加到结果中。
答案 0 :(得分:3)
你试过了吗?
Receipt.objects.filter(ingredients__name__in=['egg','bread','meat','onion'])
答案 1 :(得分: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有替代解决方案吗?