2015-07-09 4 views
-2

Я новичок в Django REST Framework, поэтому у меня есть один вопрос.Один фильтр для двух моделей

У меня есть две модели :

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) 
    ..... 

Serializer.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 

Существует вопрос: Могу ли я сделать Рецепт query filteri ng по категория (модель рецепта) и, например, Идентификатор ингредиентов (модель рецепта), так что это будет один запрос?

Например: идентификатор

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

Основной проблемой, что категории поле в рецепте модели, но ингредиентов в модели RecipeIngredients, но каждый ингредиент относится к идентификатор рецепта.

+0

Ваш вопрос не совсем ясен. Как вы хотите фильтровать? –

+0

Спасибо за ответ. Например, я хочу показать все рецепты, которые находятся в ** Категория ** [category_name] и с конкретным списком ** ингредиентов **. htttp: //127.0.0.1/api/recipes? Category = еда и ингредиенты = [ингредиенты/ингредиент]. Что-то вроде этого. – someart

ответ

0

На ваш взгляд вы можете переопределить метод 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) 
+1

Рахул, большое спасибо. Это действительно помогает мне! – someart