Есть ли способ создать связанные энтитеты внутри post-запроса с помощью django rest framwork?

Если я звучу растерянно, то это потому, что так оно и есть. Я незнаком с фреймворком django rest и пытаюсь создать относительно простое приложение для управления рецептами, которое позволяет автоматически создавать список покупок.

Мотивации : Я знаю, что DRF может быть не нужен, и я мог бы просто использовать django, но смысл этого приложения в том, чтобы научиться использовать DRF. Цель состоит в том, чтобы создать бэк с помощью DRF, а затем сделать некоторые причудливые махинации с фронт-фреймворком.

Проблема: У меня есть модель Recipe, которая содержит поле ManyToMany для Ingredient через RecipeIngredient. И я немного запутался, как мне следует подходить к RecipeSerializer. Пока что это выглядит так :

class RecipeSerializer(serializers.ModelSerializer):

    class Meta:
        model = Recipe
        fields = ('id','name','ingredients','tags','prep_time','cook_time', 'servings', 'instructions')

Но мне кажется, что всякий раз, когда я захочу создать рецепт, мне придется отправлять пост-запрос для создания Ingredients (если они еще не существуют), один для создания Instructions, один для создания Recipe и один для создания RecipeIngredients.

Вопрос : Есть ли способ сделать один запрос, содержащий рецепт и все подполя (ингредиент, рецепт-ингредиент, инструкция) и создать все сущности? Я полагаю, что это будет обработано функцией create в RecipeSerializer.

Модель:

class Tag(models.Model):
    name = models.CharField(max_length=100, unique=True)

class Ingredient(models.Model):
    name = models.CharField(max_length=100, unique=True)

class Recipe(models.Model):
    name = models.CharField(max_length=100)
    ingredients = models.ManyToManyField(Ingredient,through='RecipeIngredient')
    tags = models.ManyToManyField(Tag, related_name='recipes')
    prep_time = models.PositiveIntegerField()
    cook_time = models.PositiveIntegerField()
    servings = models.PositiveIntegerField()

class Instruction(models.Model):
    number = models.PositiveIntegerField()
    text = models.TextField()
    recipe = models.ForeignKey(Recipe, related_name='instructions', on_delete = models.CASCADE)

class RecipeIngredient(models.Model):
    ingredient = models.ForeignKey(Ingredient, on_delete = models.CASCADE)
    recipe = models.ForeignKey(Recipe, on_delete = models.CASCADE)
    quantity = models.PositiveIntegerField()
    unit = models.CharField(max_length=30, null= False, blank=True)

Сериализаторы:

class TagSerializer(serializers.ModelSerializer):
    recipes = serializers.PrimaryKeyRelatedField(queryset = Recipe.objects.all(), many = True)

    class Meta:
        model = Tag
        fields = ('id','name', 'recipes')

class InstructionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Instruction
        fields = ('id','number','text','recipe')


class IngredientSerializer(serializers.ModelSerializer):
    class Meta:
        model = Ingredient
        fields = ('id','name')

class RecipeIngredientSerializer(serializers.ModelSerializer):
    class Meta:
        model = RecipeIngredient
        fields = ('id','ingredient','recipe','quantity','unit')


class RecipeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Recipe
        fields = ('id','name','ingredients','tags','prep_time','cook_time', 'servings', 'instructions')
Вернуться на верх