/
Anubis55
/
Web-Polytech
Обзор
Документация
Войти
/
Anubis55
/
Web-Polytech
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
comics/api/serializers.py
139 строк
5 KB
Anubis55
добавлены докстринги и аннотации к методам, классам
25 июн 2026, 07:23
25 июн 2026, 07:23
060db92
Код
Авторство
О чём код?
from typing import Optional, Dict, Any from rest_framework import serializers from comics.models import Comic, Chapter, Comment, Favorite, Rating, Genre, Author class GenreSerializer(serializers.ModelSerializer): class Meta: model = Genre fields = ['id', 'name', 'slug'] class AuthorSerializer(serializers.ModelSerializer): class Meta: model = Author fields = ['id', 'name', 'slug'] class ChapterSerializer(serializers.ModelSerializer): class Meta: model = Chapter fields = ['id', 'number', 'title', 'content', 'file', 'views', 'published_at'] class CommentSerializer(serializers.ModelSerializer): """ Сериализатор для комментариев с именем пользователя. """ username = serializers.CharField(source='user.username', read_only=True) class Meta: model = Comment fields = ['id', 'user', 'username', 'comic', 'text', 'created_at', 'is_approved'] read_only_fields = ['user', 'created_at'] class RatingSerializer(serializers.ModelSerializer): username = serializers.CharField(source='user.username', read_only=True) class Meta: model = Rating fields = ['id', 'user', 'username', 'comic', 'score', 'rated_at'] read_only_fields = ['user', 'rated_at'] class FavoriteSerializer(serializers.ModelSerializer): username = serializers.CharField(source='user.username', read_only=True) class Meta: model = Favorite fields = ['id', 'user', 'username', 'comic', 'status', 'added_at'] read_only_fields = ['user', 'added_at'] class ComicSerializer(serializers.ModelSerializer): authors = AuthorSerializer(many=True, read_only=True) genres = GenreSerializer(many=True, read_only=True) avg_rating = serializers.SerializerMethodField() total_chapters = serializers.SerializerMethodField() total_comments = serializers.SerializerMethodField() favorites_count = serializers.SerializerMethodField() is_favorite = serializers.SerializerMethodField() class Meta: model = Comic fields = [ 'id', 'title', 'slug', 'description', 'cover', 'status', 'views', 'official_url', 'created_at', 'updated_at', 'authors', 'genres', 'avg_rating', 'total_chapters', 'total_comments', 'favorites_count', 'is_favorite' ] def get_avg_rating(self, obj: Comic) -> Optional[float]: """ Возвращает среднюю оценку комикса или None. Args: obj: Объект комикса. """ if hasattr(obj, 'avg_rating'): return obj.avg_rating return obj.ratings.aggregate(avg=serializers.Avg('score'))['avg'] def get_total_chapters(self, obj: Comic) -> int: """ Возвращает количество глав комикса. Args: obj: Объект комикса. """ if hasattr(obj, 'total_chapters'): return obj.total_chapters return obj.chapters.count() def get_total_comments(self, obj: Comic) -> int: """ Возвращает количество комментариев комикса. Args: obj: Объект комикса. """ if hasattr(obj, 'total_comments'): return obj.total_comments return obj.comments.count() def get_favorites_count(self, obj: Comic) -> int: """ Возвращает количество пользователей, добавивших комикс в закладки. Args: obj: Объект комикса. """ if hasattr(obj, 'favorites_count'): return obj.favorites_count return obj.favorites.count() def get_is_favorite(self, obj: Comic) -> bool: """ Проверяет, добавлен ли комикс в закладки текущим пользователем. Args: obj: Объект комикса. Returns: bool: True, если комикс в закладках у пользователя. """ request = self.context.get('request') if request and request.user.is_authenticated: return obj.favorites.filter(user=request.user).exists() return False class ComicDetailSerializer(ComicSerializer): chapters = ChapterSerializer(many=True, read_only=True) comments = CommentSerializer(many=True, read_only=True) class Meta(ComicSerializer.Meta): fields = ComicSerializer.Meta.fields + ['chapters', 'comments']