Ошибка атрибута при попытке создания модели
Я получил это сообщение об ошибке
Получили ошибку AttributeError при попытке получить значение для поля id
на сериализаторе IngredientSerializer
.
Поле сериализатора может быть названо неверно и не соответствовать какому-либо атрибуту или ключу экземпляра Ingredient
.
Оригинальный текст исключения был: 'Ingredient' object has no attribute 'ingredient'.
при попытке сохранить модель в DRF.
Мои сериализаторы:
from django.db import transaction
from rest_framework import serializers
from .models import Recipe, Ingredient, RecipeIngredient, Tag
class IngredientSerializer(serializers.ModelSerializer):
id = serializers.PrimaryKeyRelatedField(queryset=Ingredient.objects.all, source="ingredient")
amount = serializers.IntegerField()
class Meta:
model = RecipeIngredient
fields = ["id", "amount"]
class CreateRecipeSerializer(serializers.ModelSerializer):
ingredients = IngredientSerializer(many=True)
tags=serializers.PrimaryKeyRelatedField(...)
image = serializers.ImageField(required=False)
name = serializers.CharField(source="recipe_name")
class Meta:
model = Recipe
fields = ["name", "image", "text", "cooking_time", "ingredients", "tags"]
def create(self, validated_data):
ingredients_data = validated_data.pop("ingredients")
tags_data = validated_data.pop("tags")
with transaction.atomic():
recipe = Recipe.objects.create(**validated_data)
recipe.tags.set(tags_data)
recipe_ingredients = [
RecipeIngredient(
recipe=recipe,
ingredient=ingredient_data["ingredient"],
amount=ingredient_data["amount"],
)
for ingredient_data in ingredients_data]
RecipeIngredient.objects.bulk_create(recipe_ingredients)
return recipe
А мои модели здесь
class Ingredient(models.Model):
ingredient_name = models.CharField(max_length=MAX_LENGTH_200)
measurement_unit = models.CharField(max_length=MAX_LENGTH_200)
class Recipe(models.Model):
ingredients = models.ManyToManyField(Ingredient, through="RecipeIngredient", related_name="recipes")
tags = models.ManyToManyField(Tag, related_name="recipes")
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="recipes")
recipe_name = models.CharField(max_length=MAX_LENGTH_200)
image = models.ImageField(upload_to="recipes/images/")
text = models.TextField()
cooking_time = models.PositiveIntegerField(validators= [MinValueValidator(1),MaxValueValidator(50000)])
class RecipeIngredient(models.Model):
recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE,
related_name="recipe_ingredients")
ingredient = models.ForeignKey(Ingredient,
on_delete=models.CASCADE, related_name="ingredients")
amount = models.PositiveIntegerField()
Я не могу понять, в чем может быть проблема, я пытался писать как на обычном сериализаторе, так и как описано выше с помощью ModelSerializer, но получаю ту же ошибку.
Использую django 3.2.25, если это имеет значение в данном случае. Буду благодарен за любую помощь
Вы используете recipe_ingredients
в качестве источника для ingredients
, а не , поэтому:ingredients
class CreateRecipeSerializer(serializers.ModelSerializer):
ingredients = IngredientSerializer(many=True, source='recipe_ingredients')
tags = serializers.PrimaryKeyRelatedField(
queryset=Tag.objects.all(), many=True
)
image = serializers.ImageField(required=False)
name = serializers.CharField(source='recipe_name')
class Meta:
model = Recipe
fields = ['name', 'image', 'text', 'cooking_time', 'ingredients', 'tags']