【问题标题】:Django cooking recipes site model structureDjango 烹饪食谱网站模型结构
【发布时间】: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 个元素,所以我们将它添加到结果中。

【问题讨论】:

    标签: python mysql sql django model


    【解决方案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 有什么替代解决方案吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 2011-09-03
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      相关资源
      最近更新 更多