Создание и изменение рецептов работает некорректно
Помогите пожалуйста! Я пытаюсь реализовать функцию создания рецептов. Данные создаются и потом их можно получить, с помощью пост запроса, изменения тоже вносятся. Но при создании сайта, редирект не происходит и выдает такую ошибку.
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
Я пытался решить эту проблему, изменив поле в сериализаторе, но это не сработало