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
, но теперь мне нужно изменить его для вложенной сериализации и я не знаю, как сделать это правильно