Django REST Framework: TypeError: объект 'ManyRelatedManager' не является итерируемым для вложенного сериализатора M2M

У меня есть две модели: Recipe и Ingredient, которые связаны по принципу ManyToMany через RecipeIngredient:

class Recipe(models.Model):
    ...
    ingredients = models.ManyToManyField(
        'Ingredient',
        through='RecipeIngredient',
    )
    ...

class Ingredient(models.Model):
    name = models.CharField(
        max_length=LENGTH_FOR_CHARFIELD
    )
    measurement_unit = models.CharField(
        max_length=LENGTH_FOR_CHARFIELD
    )

class RecipeIngredient(models.Model):
    recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE)
    ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
    amount = models.PositiveIntegerField()

У меня также есть класс сериализатора для Recipe с вложенным сериализатором для RecipeIngredient:

class IngredientRecipeSerializerForWrite(serializers.ModelSerializer):

    class Meta:
        model = RecipeIngredient
        fields = ('ingredient_id', 'amount')

    def create(self, validated_data):
        recipe_ingredient = RecipeIngredient.objects.create(**self.initial_data)
        return recipe_ingredient


class RecipeSerializerForWrite(serializers.ModelSerializer):
    ingredients = IngredientRecipeSerializerForWrite(many=True)

    class Meta:
        model = Recipe
        fields = (
            ...
            'ingredients',
            ...
        )

    def validate(self, attrs):
        attrs['ingredients'] = self.initial_data['ingredients']
        for item in attrs['ingredients']:
            item['ingredient_id'] = item.pop('id')
        return attrs

    def create(self, validated_data):
        tags = validated_data.pop('tags')
        ingredients = validated_data.pop('ingredients')
        recipe = Recipe.objects.create(**validated_data)
        recipe.tags.set(tags)
        for item in ingredients:
            item['recipe'] = recipe
            ingredients_serializer = IngredientRecipeSerializerForWrite(
                data=item
            )
            ingredients_serializer.is_valid()
            ingredients_serializer.save()
        return recipe

Данные из запроса должны поступать в формате:

  "ingredients": [
    {
      "id": {{firstIndredientId}},
      "amount": {{firstIngredientAmount}}
    },
    {
      "id": {{secondIndredientId}},
      "amount": {{secondIngredientAmount}}
    }

Я пытаюсь передать данные в IngredientRecipeSerializerForWrite и создать там объекты, но получаю ошибку

TypeError: 'ManyRelatedManager' object is not iterable

Я использую сериализатор для RecipeIngredient модели, потому что мне нужно передать amount значение в это отношение

Раньше я обрабатывал его с помощью serializers.ListField и создавал объект m2m непосредственно в RecipeSerializerForWrite, но теперь мне нужно изменить его для вложенной сериализации и я не знаю, как сделать это правильно

Вернуться на верх