/
Anubis55
/
Web-Polytech
Обзор
Документация
Войти
/
Anubis55
/
Web-Polytech
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
comics/api/views.py
120 строк
4 KB
Anubis55
добавлены докстринги и аннотации к методам, классам
25 июн 2026, 07:23
25 июн 2026, 07:23
060db92
Код
Авторство
О чём код?
from typing import Optional, Dict, Any, Union, Type from rest_framework import viewsets, permissions, filters from django_filters.rest_framework import DjangoFilterBackend from django.db.models import Avg, Count from comics.models import Comic, Chapter, Comment, Favorite, Rating from .serializers import ( ComicSerializer, ComicDetailSerializer, ChapterSerializer, CommentSerializer, FavoriteSerializer, RatingSerializer ) class ComicViewSet(viewsets.ReadOnlyModelViewSet): """ API ViewSet для комиксов (только чтение). """ queryset = Comic.objects.all().annotate( avg_rating=Avg('ratings__score'), total_chapters=Count('chapters'), total_comments=Count('comments'), favorites_count=Count('favorites__user', distinct=True) ).prefetch_related('authors', 'genres') serializer_class = ComicSerializer filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter] filterset_fields = ['status', 'genres__slug', 'authors__slug'] search_fields = ['title'] ordering_fields = ['views', 'created_at', 'avg_rating'] def get_serializer_class(self) -> Type: """ Выбирает сериализатор в зависимости от действия. Returns: Type: ComicDetailSerializer для детального просмотра, иначе ComicSerializer. """ if self.action == 'retrieve': return ComicDetailSerializer return ComicSerializer class ChapterViewSet(viewsets.ReadOnlyModelViewSet): """ API ViewSet для глав (только чтение). """ queryset = Chapter.objects.all().select_related('comic') serializer_class = ChapterSerializer filterset_fields = ['comic'] class CommentViewSet(viewsets.ModelViewSet): """ API ViewSet для комментариев (полный CRUD). """ queryset = Comment.objects.all().select_related('user') serializer_class = CommentSerializer permission_classes = [permissions.AllowAny] def perform_create(self, serializer) -> None: """ Создаёт комментарий с принудительной подстановкой user_id=1. Args: serializer: Сериализатор для создания комментария. """ serializer.save(user_id=1) class FavoriteViewSet(viewsets.ModelViewSet): """ API ViewSet для закладок (полный CRUD). """ queryset = Favorite.objects.all().select_related('user', 'comic') serializer_class = FavoriteSerializer permission_classes = [permissions.AllowAny] def get_queryset(self): """ Возвращает все закладки (без фильтрации). Returns: QuerySet: Все закладки. """ return self.queryset def perform_create(self, serializer) -> None: """ Создаёт закладку с принудительной подстановкой user_id=1. Args: serializer: Сериализатор для создания закладки. """ serializer.save(user_id=1) class RatingViewSet(viewsets.ModelViewSet): """ API ViewSet для оценок (полный CRUD). """ queryset = Rating.objects.all().select_related('user', 'comic') serializer_class = RatingSerializer permission_classes = [permissions.AllowAny] def get_queryset(self): """ Возвращает все оценки (без фильтрации). Returns: QuerySet: Все оценки. """ return self.queryset def perform_create(self, serializer) -> None: """ Создаёт оценку с принудительной подстановкой user_id=1. Args: serializer: Сериализатор для создания оценки. """ serializer.save(user_id=1)