两种型号一个过滤器

2024-10-02 12:36:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Django REST框架的新手,所以我有一个问题

我有两种型号:

class Recipe(models.Model):
    recipe_id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=100)
    category = models.ForeignKey(FoodCategory)
    .....

class RecipeIngredients(models.Model):
    ri_id = models.AutoField(primary_key=True)
    recipe_id = models.ForeignKey(Recipe)
    ri_number = models.IntegerField()
    ingredient_id = models.ForeignKey(Ingredient)
    .....

序列化程序.py:

class RecipeSerializer(serializers. ModelSerializer):
    class Meta:
        model = Recipe
        fields = ('recipe_id', 'title', 'category',....)

class RecipeIngredientSerializer(serializers.ModelSerializer):
    class Meta:
        model = RecipeIngredients
        fields = ('ri_id', 'recipe_id', 'ri_number', 'ingredient_id', ...)

每个输出:

{"recipe_id":1,"title":"Recipe1","category":1, ....} # Recipe

[{"ri_id":15,"recipe_id":1,"ri_number":1,"ingredient_id":6,},
{"ri_id":16,"recipe_id":1,"ri_number":2,"ingredient_id":7,....}] # RecipeIngredients

有一个问题:我是否可以通过类别(配方模型)和成分的id(RecipeIngCredits模型)进行配方查询过滤,这样就可以进行一次查询

例如:

http://127.0.0.1/api/recipes?category=category_name&ingredients=[ingred_list]

主要问题是类别字段在配方模型中,而配料id在配方模型中,但每个配料都引用配方id


Tags: 模型idnumbermodeltitlemodels配方recipe
1条回答
网友
1楼 · 发布于 2024-10-02 12:36:46

您可以重写视图中的get_queryset()方法。我们首先得到recipe_ids的列表,其中ingredient_id值作为从查询参数接收的ingredient_id值之一。然后我们过滤所有具有recipe_id值的菜谱作为recipe_ids中的值,category作为查询参数中接收到的category

def get_queryset(self):
    category = self.request.query_params['category']
    ingredient_ids = self.request.query_params['ingredients[]'] # [] because getting multiple values for a same key
    recipe_ids = RecipeIngredients.objects.filter(ingredient_id__in=ingredient_ids).values_list('recipe_id', flat=True)
    return Recipe.objects.filter(recipe_id__in=recipe_ids, category=category)

相关问题 更多 >

    热门问题