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 烹饪食谱网站模型结构的主要内容,如果未能解决你的问题,请参考以下文章

使用成分、食谱和组件组织 django 食谱应用程序模型的最佳方式

Jekyll:在另一个帖子中包含一个帖子

跟大佬学django-编写博客的数据模型类

最近用django做了个在线数据分析小网站

如何访问 django 中的链接表

django 的网站创建步骤创建模型