Django 烹饪食谱网站模型结构
Posted
技术标签:
【中文标题】Django 烹饪食谱网站模型结构【英文标题】:Django cooking recipes site model structure 【发布时间】:2012-02-24 08:05:56 【问题描述】:我正在开发 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']
列表。
现在我需要从成分列表中选择所有可以制作的食谱。 问题是,有些食谱可能只有列表中的一些成分。 例如:
鸡蛋吐司 = 鸡蛋 + 面包 肉蛋吐司 = 肉 + 蛋 + 面包 洋葱肉 = 肉 + 洋葱 等等……所以我的问题是:是否有可能从配料列表中选择所有可以制作的食谱,并从配料列表中选择最接近的食谱+商店中的一些食材?
例如:recipes 有 4 个元素中的 3 个元素,所以我们将它添加到结果中。
【问题讨论】:
【参考方案1】:你试过了吗:
Receipt.objects.filter(ingredients__name__in=['egg','bread','meat','onion'])
【讨论】:
应该是ingredients__name__in=['egg', 'bread', 'meat', 'onion']
?
好收获!刚修好。谢谢:)
是的,我从一开始就尝试过,但问题是它给了我非常大的列表,没有任何排序和排序。有很多用鸡蛋做的食谱,没有一个是用鸡蛋+面包做的。
啊,换句话说,它给你的食谱至少包含一种成分,而不是全部(或全部少一种,等等)?
您可以链接过滤器并使用单个元素,例如: Receipt.objects.filter(ingredients__name='egg').filter(ingredients__name='bread').... 显然是一个混乱的解决方案,但可以不要想别的。你用的是什么数据库?你可以使用原始 sql 吗?【参考方案2】:
我想我找到了一种解决方案。使用代码
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 有什么替代解决方案吗?
【讨论】:
以上是关于Django 烹饪食谱网站模型结构的主要内容,如果未能解决你的问题,请参考以下文章