Serializers в Python

Dimetra

Новичок
Пользователь
Ноя 22, 2022
9
1
3
Всем привет, подскажите пожалуйста, обучаюсь, ревью прислали изменить, не понимаю как правильно тут сделать, помогите пожалуйста.
Часть кода из всего что скинул снизу
Python:
def validate_tags(self, value):
        if not value:
            raise ValidationError({'Выберите теги.'})
        values_slug = [i for i in value] ------------------------------------------------------"""РЕВЬЮ написал - Лишняя переменная"""
        if len(values_slug) != len(set(values_slug)):
            raise ValidationError({'Теги повторяются.'})
        return value

def validate_ingredients(self, value):
        if not value:
            raise ValidationError({'Выберите ингредиенты.'})
        len_amount = [i for i in value if int(i['amount']) <= 0]
        if len_amount: -------------------------"""РЕВЬЮ написал - Некорректная проверка - может быть всего 5 ингредиентов и два из них с отрицательным кол-ом"""
            raise ValidationError({'Выберите кол-во ингредиентов.'})
        values_id = [i['id'] for i in value]
        if len(values_id) != len(set(values_id)):
            raise ValidationError({'Ингредиенты повторяются.'})
        return value


Вся часть кода отвечающая за создания, редактирования и удаления рецепта
Python:
class CreateRecipeSerializer(ModelSerializer):
    """ Сериализатор  создания, редактирования и удаления рецепта"""
    author = UsersSerializer(read_only=True)
    tags = PrimaryKeyRelatedField(queryset=Tag.objects.all(), many=True)
    ingredients = CreateRecipeIngredientSerializer(many=True)
    cooking_time = IntegerField()
    image = Base64ImageField(use_url=True)
    class Meta:
        model = Recipe
        fields = ['id', 'image', 'tags', 'author',
                  'ingredients', 'name', 'text', 'cooking_time']
    def validate_tags(self, value):
        if not value:
            raise ValidationError({'Выберите теги.'})
        values_slug = [i for i in value]
        if len(values_slug) != len(set(values_slug)):
            raise ValidationError({'Теги повторяются.'})
        return value
    def validate_ingredients(self, value):
        if not value:
            raise ValidationError({'Выберите ингредиенты.'})
        len_amount = [i for i in value if int(i['amount']) <= 0]
        if len_amount:
            raise ValidationError({'Выберите кол-во ингредиентов.'})
        values_id = [i['id'] for i in value]
        if len(values_id) != len(set(values_id)):
            raise ValidationError({'Ингредиенты повторяются.'})
        return value
    @atomic
    def create_ingredients(self, recipe, ingredients):
        IngredientRecipe.objects.bulk_create(
            [IngredientRecipe(
                recipe=recipe,
                ingredient_id=row.get('id'),
                amount=row.get('amount'),
            ) for row in ingredients])
    @atomic
    def create(self, validated_data):
        request = self.context.get('request')
        tags = validated_data.pop('tags')
        ingredients = validated_data.pop('ingredients')
        recipe = Recipe.objects.create(author=request.user,
                                       **validated_data)
        self.create_ingredients(recipe, ingredients)
        recipe.tags.set(tags)
        return recipe
    @atomic
    def update(self, instance, validated_data):
        ingredients = validated_data.pop('ingredients')
        IngredientRecipe.objects.filter(recipe=instance).delete()
        self.create_ingredients(instance, ingredients)
        return super().update(instance, validated_data)
    def to_representation(self, instance):
        return RecipeSerializer(
            instance,
            context={'request': self.context.get('request')}
        ).data
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
по первому не понятно, что имеется ввиду, может не нужно переменную values_slug, а просто пихать генератор списка вместо нее

по второму - у вас нет проверки на кол во и условие всегда меньше или равно нулю, то есть если в len_amount будет 6 элементов и все с условиями меньше нуля, то ошибки у вас не будет, а кто больше нуля - в список не попадут, а нужно только 5 элементов максимум и только два меньше нуля, судя по коменту

это же какое то задание, почему не спросить уточнение, кто вам ревью делал?
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
и по первому, если value - это список, то зачем вы делаете еще один список, можно сразу оперировать с value
 

Dimetra

Новичок
Пользователь
Ноя 22, 2022
9
1
3
и по первому, если value - это список, то зачем вы делаете еще один список, можно сразу оперировать с value
А не могли бы Вы написать как это получится, пожалуйста
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 583
457
83
А не могли бы Вы написать как это получится, пожалуйста
Python:
def validate_tags(self, value):
        if not value:
            raise ValidationError({'Выберите теги.'})
        if len(value) != len(set(value)):
            raise ValidationError({'Теги повторяются.'})
        return value
 

Dimetra

Новичок
Пользователь
Ноя 22, 2022
9
1
3
Python:
def validate_tags(self, value):
        if not value:
            raise ValidationError({'Выберите теги.'})
        if len(value) != len(set(value)):
            raise ValidationError({'Теги повторяются.'})
        return value
Спасибо большое, попробую еще вот так

Python:
def validate_tags(self, value: list) -> list:
        if not value:
            raise ValidationError('Выберите теги')
        return list(set(value))
 

Форум IT Специалистов