Есть ли способ создать связанные энтитеты внутри 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')