如何确保每个孩子都能满足Django模型的一个条件?

时间:2016-12-01 23:24:44

标签: python django orm model

当且仅当所有成分都包含在成分列表中时,我才需要寻找食谱。

在SQL中,查询类似于

SELECT *
FROM recipe r
WHERE no exists (SELECT 1
                   FROM recipe_ingredient ri
                  WHERE r.id = ri.recipe_id
                    AND ri.ingredient_id not in (1,2,3))

其中1,2,3是成分列表。

如何使用Django模型执行此操作?

1 个答案:

答案 0 :(得分:1)

我不知道你的模型是怎样的,但这是一种可行的方法

# Possible models.py
class Recipe(models.Model):
    ingredients = models.ManyToManyField('Ingredient', related_name='in_recipes')
    ...

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

# views.py
from django.db.models import Q

# Use Q objects to create a query that requires all ingredients
ingredient_query = None
for an_ingredient in REQUIRED_INGREDIENTS:
    ingredient_query = ingredient_query & Q(ingredients=an_ingredient) if ingredient_query else Q(ingredients=an_ingredient)

recipes_with_ingredients = Recipe.objects.filter(ingredient_query)