/
eb
/
yamdb_final
Обзор
Документация
Войти
/
eb
/
yamdb_final
Код
Запросы
0
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
api/serializers.py
125 строк
4 KB
Evgeniy Budaev
workflow: тесты
02 ноя 2021, 12:38
02 ноя 2021, 12:38
68658ca
Код
Авторство
О чём код?
from django.db.models import Avg from rest_framework import exceptions, serializers from rest_framework.relations import SlugRelatedField from rest_framework.validators import UniqueValidator from api_yamdb.settings import (MESSAGE_FOR_RESERVED_NAME, MESSAGE_FOR_USER_NOT_FOUND, RESERVED_NAME) from reviews.models import Comment, Review from titles.models import Category, Genre, Title from users.models import User class CategorySerializer(serializers.ModelSerializer): class Meta: model = Category fields = ('name', 'slug') class GenreSerializer(serializers.ModelSerializer): class Meta: model = Genre fields = ('name', 'slug') class TitleSerializer(serializers.ModelSerializer): category = CategorySerializer(read_only=True) genre = GenreSerializer(many=True, read_only=True) rating = serializers.SerializerMethodField() class Meta: model = Title fields = ('id', 'name', 'year', 'description', 'genre', 'category', 'rating') read_only_fields = ('id',) def get_rating(self, obj): try: rating = obj.reviews.aggregate(Avg('score')) return rating.get('score__avg') except TypeError: return None class TitleCreateSerializer(serializers.ModelSerializer): category = serializers.SlugRelatedField( slug_field='slug', queryset=Category.objects.all() ) genre = serializers.SlugRelatedField( slug_field='slug', queryset=Genre.objects.all(), many=True ) class Meta: fields = ('id', 'name', 'year', 'description', 'genre', 'category', 'rating') model = Title class ForUserSerializer(serializers.ModelSerializer): """Сериализатор для пользователей со статусом user. Зарезервированное имя использовать нельзя""" email = serializers.EmailField( validators=[UniqueValidator(queryset=User.objects.all())] ) class Meta: model = User fields = ( 'username', 'email', 'first_name', 'last_name', 'bio', 'role' ) read_only_fields = ('role', ) def validate_username(self, value): if value == RESERVED_NAME: raise serializers.ValidationError(MESSAGE_FOR_RESERVED_NAME) return value class ForAdminSerializer(serializers.ModelSerializer): """Сериализатор для пользователей со статусом admin. Зарезервированное имя использовать нельзя""" email = serializers.EmailField( validators=[UniqueValidator(queryset=User.objects.all())]) class Meta: model = User fields = ( 'username', 'email', 'first_name', 'last_name', 'bio', 'role') def validate_username(self, value): if value == RESERVED_NAME: raise serializers.ValidationError(MESSAGE_FOR_RESERVED_NAME) return value class TokenSerializer(serializers.Serializer): """Сериализатор для получения токена. Зарезервированное имя использовать нельзя.""" username = serializers.CharField(max_length=200, required=True) confirmation_code = serializers.CharField(max_length=200, required=True) def validate_username(self, value): if value == RESERVED_NAME: raise serializers.ValidationError(MESSAGE_FOR_RESERVED_NAME) if not User.objects.filter(username=value).exists(): raise exceptions.NotFound(MESSAGE_FOR_USER_NOT_FOUND) return value class CommentSerializer(serializers.ModelSerializer): author = SlugRelatedField(slug_field='username', read_only=True) class Meta: model = Comment fields = ('id', 'text', 'author', 'pub_date') class ReviewSerializer(serializers.ModelSerializer): author = SlugRelatedField(slug_field='username', read_only=True) class Meta: model = Review fields = ('id', 'author', 'text', 'score', 'pub_date')