Задать вопрос
@adrenalinruslan

Как реализовать полный вывод связанных моделей после добавления нового обьекта?

У меня есть модельки Ingredient, Tag, Recipe, RecipeIngredient. Для этих моделей пишу API и как мне реализовать полный вывод связанных моделей при добавлении нового обьекта. К примеру, если делать запрос на вывод одного рецепта, ответ будет таким:

{
    "id": 27,
    "ingredients": [
        {
            "id": 8,
            "ingredient": {
                "id": 1,
                "name": "Абрикосовое варенье",
                "dimension": "г"
            },
            "quantity": "0.0"
        }
    ],
    "tags": [
        {
            "id": 1,
            "name": "Ужин",
            "color": "#8775D2FF",
            "background": "#F4F2FBFF"
        },
        {
            "id": 2,
            "name": "Обед",
            "color": "#49B64EFF",
            "background": "#EDF8EEFF"
        },
        {
            "id": 3,
            "name": "Завтрак",
            "color": "#E26C2DFF",
            "background": "#FCF2ECFF"
        }
    ],
    "name": "Наименование",
    "description": "Текстовое описание",
    "cooking_time": 60,
    "created_at": "2021-05-30T18:22:50.426105+03:00",
    "author": 1
}


Когда я отправляю запрос на создание рецепта, ответ приходит таким:

{
    "id": 36,
    "ingredients": [
        {
            "id": 13,
            "quantity": "0.0",
            "ingredient": 1
        }
    ],
    "name": "Наименование",
    "description": "Текстовое описание",
    "cooking_time": 60,
    "created_at": "2021-05-30T19:33:31.744076+03:00",
    "author": 1,
    "tags": [
        1,
        2,
        3
    ]
}


И вот вопрос, как сделать так, чтобы после создания ответ был как при обычном запросе рецепта ? Чтобы tags показывал всю информацию, а первичные ключи и тд.

class RecipeIngredientListRetrieveSerializer(serializers.ModelSerializer):
    ingredient = IngredientSerializer()

    class Meta:
        model = RecipeIngredient
        exclude = ('recipe',)


class RecipeIngredientCreateSerializer(serializers.ModelSerializer):
    class Meta:
        model = RecipeIngredient
        exclude = ('recipe',)


class RecipeListRetrieveSerializer(serializers.ModelSerializer):
    ingredients = RecipeIngredientListRetrieveSerializer(
        source='recipe_ingredients', many=True)
    tags = TagSerializer(
        many=True)

    class Meta:
        model = Recipe
        fields = '__all__'


class RecipeCreateSerializer(serializers.ModelSerializer):
    ingredients = RecipeIngredientCreateSerializer(
        source='recipe_ingredients', many=True)

    class Meta:
        model = Recipe
        fields = '__all__'

    def create(self, validated_data):
        ingredients = validated_data.pop('recipe_ingredients')
        instance = super().create(validated_data)
        ingredients = [
            RecipeIngredient(
                recipe=instance,
                ingredient=ingredient['ingredient'],
                quantity=ingredient['quantity']
            ) for ingredient in ingredients
        ]
        instance.recipe_ingredients.add(*ingredients, bulk=False)
        return instance
  • Вопрос задан
  • 131 просмотр
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы