Создание и изменение рецептов работает некорректно

Помогите пожалуйста! Я пытаюсь реализовать функцию создания рецептов. Данные создаются и потом их можно получить, с помощью пост запроса, изменения тоже вносятся. Но при создании сайта, редирект не происходит и выдает такую ошибку.

AttributeError: Получена ошибка AttributeError при попытке получить значение для поля amount на сериализаторе AmountIngredientForRecipePostSerializer. Поле сериализатора может быть названо неправильно и не совпадать ни с одним атрибутом или ключом экземпляра Ingredient. Оригинальный текст исключения был: 'Ingredient' object has no attribute 'amount'.

view

class RecipesViewSet(viewsets.ModelViewSet):
    queryset = Recipe.objects.all().order_by('id')
    filter_backends = (DjangoFilterBackend,)
    filter_class = RecipeFilter
    pagination_class = PagePagination
    permission_classes = (OwnerOrAdminOrSafeMethods,)

    def get_serializer_class(self):
        if self.request.method == 'GET':
            return RecipeGetSerializer
        return RecipePostSerializer

    @staticmethod
    def post_or_delete(request, model, serializer, pk):
        if request.method != 'POST':
            get_object_or_404(
                model,
                user=request.user,
                recipe=get_object_or_404(Recipe, id=pk)
            ).delete()
            return Response(status=status.HTTP_204_NO_CONTENT)
        serializer = serializer(
            data={'user': request.user.id, 'recipe': pk},
            context={'request': request})
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)

serialaizer

class AmountIngredientForRecipePostSerializer(serializers.ModelSerializer):
    id = serializers.PrimaryKeyRelatedField(queryset=Ingredient.objects.all())
    amount = serializers.IntegerField(min_value=1)

    class Meta:
        model = AmountIngredient
        fields = ('id', 'amount')


class RecipePostSerializer(serializers.ModelSerializer):
    author = CostomUserSerializer(read_only=True)
    ingredients = AmountIngredientForRecipePostSerializer(many=True)
    tags = serializers.PrimaryKeyRelatedField(
        queryset=Tags.objects.all(), many=True)
    image = Base64ImageField()

    class Meta:
        model = Recipe
        fields = ('id', 'author', 'ingredients', 'tags',
                  'image', 'name', 'text', 'cooking_time')

    @staticmethod
    def create_ingredients_tags(recipe, ingredients, tags):
        for ingredient in ingredients:
            AmountIngredient.objects.create(
                recipe=recipe,
                ingredient=ingredient['id'],
                amount=ingredient['amount']
            )
        for tag in tags:
            recipe.tags.add(tag)

    def create(self, validated_data):
        ingredients = validated_data.pop('ingredients')
        tags = validated_data.pop('tags')
        recipe = Recipe.objects.create(
            author=self.context.get('request').user,
            **validated_data
        )
        self.create_ingredients_tags(recipe, ingredients, tags)
        return recipe

    def update(self, recipe, validated_data):
        recipe.tags.clear()
        AmountIngredient.objects.filter(recipe=recipe).delete()
        ingredients = validated_data.pop('ingredients')
        tags = validated_data.pop('tags')
        self.create_ingredients_tags(recipe, ingredients, tags)
        return super().update(recipe, validated_data)

    def validate(self, data):
        ingredients = self.initial_data.get('ingredients')
        ingredients_list = []
        for ingredient in ingredients:
            ingredient_id = ingredient['id']
            if ingredient_id in ingredients_list:
                raise serializers.ValidationError({
                    'ingredient': 'already have'
                })
            ingredients_list.append(ingredient_id)
        return data

    def to_representation(self, object):
        data = super().to_representation(object)
        data["image"] = object.image.url
        return data

модели

class Recipe(models.Model):
    tags = models.ManyToManyField(Tags, verbose_name='Теги')
    author = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name='author',
    )
    ingredients = models.ManyToManyField(
        Ingredient,
        through='AmountIngredient',
        through_fields=('recipe', 'ingredient'),
        related_name='ingredients',
    )
    name = models.CharField(
        max_length=150,
        db_index=True,
    )
    image = models.ImageField(
        upload_to='recipes/',
    text = models.TextField()
    cooking_time = models.PositiveSmallIntegerField(
        validators=[MinValueValidator(
            1,
            message='min 1 minute'
        )],
        verbose_name='time to cook'
    )

    def __str__(self):
        return self.name


class AmountIngredient(models.Model):
    recipe = models.ForeignKey(
        Recipe,
        on_delete=models.CASCADE,
    )
    ingredient = models.ForeignKey(
        Ingredient,
        on_delete=models.CASCADE,
    )
    amount = models.PositiveSmallIntegerField(
        validators=(
            MinValueValidator(
                1, 'Min 1.'
            ),
        ),
        verbose_name='Ingredients count'
    )

    class Meta:
        constraints = (
            models.UniqueConstraint(
                fields=['ingredient', 'recipe'],
                name='unique_ingredient'
            ),
        )


class Ingredient(models.Model):
    name = models.CharField(
        max_length=200,
        db_index=True,
    )
    measurement_unit = models.CharField(
        max_length=200,
    )

    def __str__(self):
        return self.name

Я пытался решить эту проблему, изменив поле в сериализаторе, но это не сработало

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