From 8b07691f8543bb3ef532fddfd5dffd661feb322e Mon Sep 17 00:00:00 2001 From: serhii Date: Wed, 2 Oct 2024 16:56:07 +0300 Subject: [PATCH 1/6] task done --- cinema/models.py | 25 +++++++---- cinema/serializers.py | 74 +++++++++++++++++++++++++++++++- cinema/urls.py | 2 + cinema/views.py | 86 +++++++++++++++++++++++++++++++++++++- cinema_service/settings.py | 2 +- 5 files changed, 176 insertions(+), 13 deletions(-) diff --git a/cinema/models.py b/cinema/models.py index f18f166c..81e1dde7 100644 --- a/cinema/models.py +++ b/cinema/models.py @@ -84,24 +84,33 @@ class Ticket(models.Model): row = models.IntegerField() seat = models.IntegerField() - def clean(self): + @staticmethod + def validate_ticket(row, seat, cinema_hall, error): for ticket_attr_value, ticket_attr_name, cinema_hall_attr_name in [ - (self.row, "row", "rows"), - (self.seat, "seat", "seats_in_row"), + (row, "row", "rows"), + (seat, "seat", "seats_in_row"), ]: count_attrs = getattr( - self.movie_session.cinema_hall, cinema_hall_attr_name + cinema_hall, cinema_hall_attr_name ) if not (1 <= ticket_attr_value <= count_attrs): - raise ValidationError( + raise error( { ticket_attr_name: f"{ticket_attr_name} " - f"number must be in available range: " - f"(1, {cinema_hall_attr_name}): " - f"(1, {count_attrs})" + f"number must be in available range: " + f"(1, {cinema_hall_attr_name}): " + f"(1, {count_attrs})" } ) + def clean(self): + Ticket.validate_ticket( + self.row, + self.seat, + self.movie_session.cinema_hall, + ValidationError + ) + def save( self, force_insert=False, diff --git a/cinema/serializers.py b/cinema/serializers.py index a1a4d7d4..8348cf9c 100644 --- a/cinema/serializers.py +++ b/cinema/serializers.py @@ -1,6 +1,16 @@ +from django.db import transaction from rest_framework import serializers +from rest_framework.exceptions import ValidationError -from cinema.models import Genre, Actor, CinemaHall, Movie, MovieSession +from cinema.models import ( + Genre, + Actor, + CinemaHall, + Movie, + MovieSession, + Order, + Ticket +) class GenreSerializer(serializers.ModelSerializer): @@ -59,6 +69,9 @@ class MovieSessionListSerializer(MovieSessionSerializer): cinema_hall_capacity = serializers.IntegerField( source="cinema_hall.capacity", read_only=True ) + tickets_available = serializers.IntegerField( + read_only=True + ) class Meta: model = MovieSession @@ -68,13 +81,70 @@ class Meta: "movie_title", "cinema_hall_name", "cinema_hall_capacity", + "tickets_available" ) class MovieSessionDetailSerializer(MovieSessionSerializer): movie = MovieListSerializer(many=False, read_only=True) cinema_hall = CinemaHallSerializer(many=False, read_only=True) + taken_places = serializers.SerializerMethodField() class Meta: model = MovieSession - fields = ("id", "show_time", "movie", "cinema_hall") + fields = ("id", "show_time", "movie", "cinema_hall", "taken_places") + + def get_taken_places(self, obj): + tickets = Ticket.objects.filter(movie_session=obj) + return [{"row": ticket.row, "seat": ticket.seat} for ticket in tickets] + + +class TicketSerializer(serializers.ModelSerializer): + movie_session = MovieSessionListSerializer() + + class Meta: + model = Ticket + fields = ("id", "row", "seat", "movie_session") + + def validate(self, attrs): + Ticket.validate_ticket( + attrs["row"], + attrs["seat"], + attrs["movie_session"].cinema_hall, + ValidationError + ) + return attrs + + +class TicketCreateSerializer(TicketSerializer): + movie_session = serializers.PrimaryKeyRelatedField( + queryset=MovieSession.objects.all() + ) + + +class OrderSerializer(serializers.ModelSerializer): + tickets = TicketCreateSerializer( + many=True, + read_only=False, + allow_empty=False + ) + + class Meta: + model = Order + fields = ("id", "created_at", "tickets") + + def create(self, validated_data): + with transaction.atomic(): + tickets_data = validated_data.pop("tickets") + order = Order.objects.create(**validated_data) + for ticket_data in tickets_data: + Ticket.objects.create(order=order, **ticket_data) + return order + + +class OrderRetrieveSerializer(OrderSerializer): + tickets = TicketSerializer(many=True, read_only=True) + + class Meta: + model = Order + fields = ("id", "created_at", "tickets") diff --git a/cinema/urls.py b/cinema/urls.py index e3586f00..754f7330 100644 --- a/cinema/urls.py +++ b/cinema/urls.py @@ -7,6 +7,7 @@ CinemaHallViewSet, MovieViewSet, MovieSessionViewSet, + OrderViewSet ) router = routers.DefaultRouter() @@ -15,6 +16,7 @@ router.register("cinema_halls", CinemaHallViewSet) router.register("movies", MovieViewSet) router.register("movie_sessions", MovieSessionViewSet) +router.register("orders", OrderViewSet) urlpatterns = [path("", include(router.urls))] diff --git a/cinema/views.py b/cinema/views.py index c4ff85e9..2b6589be 100644 --- a/cinema/views.py +++ b/cinema/views.py @@ -1,7 +1,8 @@ +from django.db.models import Count, F from rest_framework import viewsets +from rest_framework.pagination import PageNumberPagination -from cinema.models import Genre, Actor, CinemaHall, Movie, MovieSession - +from cinema.models import Genre, Actor, CinemaHall, Movie, MovieSession, Order from cinema.serializers import ( GenreSerializer, ActorSerializer, @@ -12,6 +13,8 @@ MovieDetailSerializer, MovieSessionDetailSerializer, MovieListSerializer, + OrderSerializer, + OrderRetrieveSerializer, ) @@ -34,6 +37,33 @@ class MovieViewSet(viewsets.ModelViewSet): queryset = Movie.objects.all() serializer_class = MovieSerializer + @staticmethod + def _params_to_ints(query_string): + return [int(str_id) for str_id in query_string.split(",")] + + def get_queryset(self): + queryset = self.queryset + + actors = self.request.query_params.get("actors") + genres = self.request.query_params.get("genres") + titles = self.request.query_params.get("title") + + if actors: + actors = self._params_to_ints(actors) + queryset = queryset.filter(actors__id__in=actors) + elif genres: + genres = self._params_to_ints(genres) + queryset = queryset.filter(genres__id__in=genres) + elif titles: + queryset = queryset.filter(title__icontains=titles) + + if self.action == "list": + queryset = queryset.prefetch_related( + "genres", + "actors" + ) + return queryset + def get_serializer_class(self): if self.action == "list": return MovieListSerializer @@ -48,6 +78,29 @@ class MovieSessionViewSet(viewsets.ModelViewSet): queryset = MovieSession.objects.all() serializer_class = MovieSessionSerializer + def get_queryset(self): + queryset = self.queryset + + date = self.request.query_params.get("date") + movie = self.request.query_params.get("movie") + + if date: + queryset = queryset.filter(show_time__date=date) + if movie: + queryset = queryset.filter(movie_id=movie) + + if self.action in "list": + queryset = ( + queryset + .prefetch_related("movie", "cinema_hall", "tickets") + .annotate( + capacity=(F("cinema_hall__rows") * + F("cinema_hall__seats_in_row")), + tickets_available=F("capacity") - Count("tickets")) + ) + + return queryset + def get_serializer_class(self): if self.action == "list": return MovieSessionListSerializer @@ -56,3 +109,32 @@ def get_serializer_class(self): return MovieSessionDetailSerializer return MovieSessionSerializer + + +class OrderSetPagination(PageNumberPagination): + page_size = 1 + page_query_param = "page_size" + max_page_size = 20 + + +class OrderViewSet(viewsets.ModelViewSet): + queryset = Order.objects.all() + pagination_class = OrderSetPagination + + def get_queryset(self): + queryset = Order.objects.filter(user=self.request.user) + + if self.action == "list": + queryset = queryset.prefetch_related( + "tickets__movie_session__movie", + "tickets__movie_session__cinema_hall" + ) + return queryset + + def get_serializer_class(self): + if self.action in ("list", "retrieve"): + return OrderRetrieveSerializer + return OrderSerializer + + def perform_create(self, serializer): + serializer.save(user=self.request.user) diff --git a/cinema_service/settings.py b/cinema_service/settings.py index a7d6c992..068db3d6 100644 --- a/cinema_service/settings.py +++ b/cinema_service/settings.py @@ -124,7 +124,7 @@ USE_I18N = True -USE_TZ = False +USE_TZ = True # Static files (CSS, JavaScript, Images) From 7f8477b1412093e67a780beee6915aa2733e5c89 Mon Sep 17 00:00:00 2001 From: serhii Date: Wed, 2 Oct 2024 17:01:56 +0300 Subject: [PATCH 2/6] fix --- cinema/models.py | 3 ++- cinema/views.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cinema/models.py b/cinema/models.py index 81e1dde7..0484b41d 100644 --- a/cinema/models.py +++ b/cinema/models.py @@ -97,7 +97,8 @@ def validate_ticket(row, seat, cinema_hall, error): raise error( { ticket_attr_name: f"{ticket_attr_name} " - f"number must be in available range: " + f"number must be " + f"in available range: " f"(1, {cinema_hall_attr_name}): " f"(1, {count_attrs})" } diff --git a/cinema/views.py b/cinema/views.py index 2b6589be..cfd84c0d 100644 --- a/cinema/views.py +++ b/cinema/views.py @@ -94,8 +94,8 @@ def get_queryset(self): queryset .prefetch_related("movie", "cinema_hall", "tickets") .annotate( - capacity=(F("cinema_hall__rows") * - F("cinema_hall__seats_in_row")), + capacity=(F("cinema_hall__rows") + * F("cinema_hall__seats_in_row")), tickets_available=F("capacity") - Count("tickets")) ) From 2964091f075c24fc0cba1aae1b3ed690affa6811 Mon Sep 17 00:00:00 2001 From: serhii Date: Wed, 9 Oct 2024 00:21:36 +0300 Subject: [PATCH 3/6] fix --- cinema/models.py | 37 +++++++++++++++++++++++-------------- cinema/serializers.py | 7 +++---- cinema/views.py | 21 ++++++++++++++------- 3 files changed, 40 insertions(+), 25 deletions(-) diff --git a/cinema/models.py b/cinema/models.py index 0484b41d..0c01d8bf 100644 --- a/cinema/models.py +++ b/cinema/models.py @@ -1,3 +1,5 @@ +from typing import Callable + from django.core.exceptions import ValidationError from django.db import models from django.conf import settings @@ -12,14 +14,14 @@ class CinemaHall(models.Model): def capacity(self) -> int: return self.rows * self.seats_in_row - def __str__(self): + def __str__(self) -> str: return self.name class Genre(models.Model): name = models.CharField(max_length=255, unique=True) - def __str__(self): + def __str__(self) -> str: return self.name @@ -27,11 +29,11 @@ class Actor(models.Model): first_name = models.CharField(max_length=255) last_name = models.CharField(max_length=255) - def __str__(self): + def __str__(self) -> str: return self.first_name + " " + self.last_name @property - def full_name(self): + def full_name(self) -> str: return f"{self.first_name} {self.last_name}" @@ -45,7 +47,7 @@ class Movie(models.Model): class Meta: ordering = ["title"] - def __str__(self): + def __str__(self) -> str: return self.title @@ -57,7 +59,7 @@ class MovieSession(models.Model): class Meta: ordering = ["-show_time"] - def __str__(self): + def __str__(self) -> str: return self.movie.title + " " + str(self.show_time) @@ -67,7 +69,7 @@ class Order(models.Model): settings.AUTH_USER_MODEL, on_delete=models.CASCADE ) - def __str__(self): + def __str__(self) -> str: return str(self.created_at) class Meta: @@ -85,7 +87,12 @@ class Ticket(models.Model): seat = models.IntegerField() @staticmethod - def validate_ticket(row, seat, cinema_hall, error): + def validate_ticket( + row: int, + seat: int, + cinema_hall: CinemaHall, + error: Callable + ): for ticket_attr_value, ticket_attr_name, cinema_hall_attr_name in [ (row, "row", "rows"), (seat, "seat", "seats_in_row"), @@ -96,11 +103,13 @@ def validate_ticket(row, seat, cinema_hall, error): if not (1 <= ticket_attr_value <= count_attrs): raise error( { - ticket_attr_name: f"{ticket_attr_name} " - f"number must be " - f"in available range: " - f"(1, {cinema_hall_attr_name}): " - f"(1, {count_attrs})" + ticket_attr_name: ( + f"{ticket_attr_name} " + f"number must be " + f"in available range: " + f"(1, {cinema_hall_attr_name}): " + f"(1, {count_attrs})" + ) } ) @@ -124,7 +133,7 @@ def save( force_insert, force_update, using, update_fields ) - def __str__(self): + def __str__(self) -> str: return ( f"{str(self.movie_session)} (row: {self.row}, seat: {self.seat})" ) diff --git a/cinema/serializers.py b/cinema/serializers.py index 8348cf9c..7d06c896 100644 --- a/cinema/serializers.py +++ b/cinema/serializers.py @@ -94,7 +94,7 @@ class Meta: model = MovieSession fields = ("id", "show_time", "movie", "cinema_hall", "taken_places") - def get_taken_places(self, obj): + def get_taken_places(self, obj: MovieSession) -> list[dict]: tickets = Ticket.objects.filter(movie_session=obj) return [{"row": ticket.row, "seat": ticket.seat} for ticket in tickets] @@ -106,7 +106,7 @@ class Meta: model = Ticket fields = ("id", "row", "seat", "movie_session") - def validate(self, attrs): + def validate(self, attrs: dict) -> dict: Ticket.validate_ticket( attrs["row"], attrs["seat"], @@ -133,13 +133,12 @@ class Meta: model = Order fields = ("id", "created_at", "tickets") - def create(self, validated_data): + def create(self, validated_data: dict): with transaction.atomic(): tickets_data = validated_data.pop("tickets") order = Order.objects.create(**validated_data) for ticket_data in tickets_data: Ticket.objects.create(order=order, **ticket_data) - return order class OrderRetrieveSerializer(OrderSerializer): diff --git a/cinema/views.py b/cinema/views.py index cfd84c0d..18a484c7 100644 --- a/cinema/views.py +++ b/cinema/views.py @@ -1,6 +1,7 @@ from django.db.models import Count, F from rest_framework import viewsets from rest_framework.pagination import PageNumberPagination +from rest_framework.serializers import ModelSerializer from cinema.models import Genre, Actor, CinemaHall, Movie, MovieSession, Order from cinema.serializers import ( @@ -38,7 +39,7 @@ class MovieViewSet(viewsets.ModelViewSet): serializer_class = MovieSerializer @staticmethod - def _params_to_ints(query_string): + def _params_to_ints(query_string: str) -> queryset: return [int(str_id) for str_id in query_string.split(",")] def get_queryset(self): @@ -62,9 +63,9 @@ def get_queryset(self): "genres", "actors" ) - return queryset + return queryset.distinct() - def get_serializer_class(self): + def get_serializer_class(self) -> ModelSerializer: if self.action == "list": return MovieListSerializer @@ -78,7 +79,7 @@ class MovieSessionViewSet(viewsets.ModelViewSet): queryset = MovieSession.objects.all() serializer_class = MovieSessionSerializer - def get_queryset(self): + def get_queryset(self) -> queryset: queryset = self.queryset date = self.request.query_params.get("date") @@ -98,10 +99,16 @@ def get_queryset(self): * F("cinema_hall__seats_in_row")), tickets_available=F("capacity") - Count("tickets")) ) + elif self.action == "retrieve": + queryset = ( + queryset + .select_related("movie", "cinema_hall") + .prefetch_related("tickets") + ) return queryset - def get_serializer_class(self): + def get_serializer_class(self) -> ModelSerializer: if self.action == "list": return MovieSessionListSerializer @@ -121,7 +128,7 @@ class OrderViewSet(viewsets.ModelViewSet): queryset = Order.objects.all() pagination_class = OrderSetPagination - def get_queryset(self): + def get_queryset(self) -> queryset: queryset = Order.objects.filter(user=self.request.user) if self.action == "list": @@ -131,7 +138,7 @@ def get_queryset(self): ) return queryset - def get_serializer_class(self): + def get_serializer_class(self) -> ModelSerializer: if self.action in ("list", "retrieve"): return OrderRetrieveSerializer return OrderSerializer From 8dbbe8094df77f10cfc581fb0e574423ee12309d Mon Sep 17 00:00:00 2001 From: serhii Date: Wed, 9 Oct 2024 15:34:48 +0300 Subject: [PATCH 4/6] fix --- cinema/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cinema/views.py b/cinema/views.py index 18a484c7..0a316bfd 100644 --- a/cinema/views.py +++ b/cinema/views.py @@ -43,7 +43,7 @@ def _params_to_ints(query_string: str) -> queryset: return [int(str_id) for str_id in query_string.split(",")] def get_queryset(self): - queryset = self.queryset + queryset = super().get_queryset() actors = self.request.query_params.get("actors") genres = self.request.query_params.get("genres") @@ -58,7 +58,7 @@ def get_queryset(self): elif titles: queryset = queryset.filter(title__icontains=titles) - if self.action == "list": + if self.action in ("list", "retrieve"): queryset = queryset.prefetch_related( "genres", "actors" @@ -80,7 +80,7 @@ class MovieSessionViewSet(viewsets.ModelViewSet): serializer_class = MovieSessionSerializer def get_queryset(self) -> queryset: - queryset = self.queryset + queryset = super().get_queryset() date = self.request.query_params.get("date") movie = self.request.query_params.get("movie") From 0eb5efedf4441b79ae43712203b0ee7a2100be09 Mon Sep 17 00:00:00 2001 From: serhii Date: Thu, 10 Oct 2024 15:30:46 +0300 Subject: [PATCH 5/6] fix --- cinema/pagination.py | 7 ++++++ cinema/serializers.py | 5 ++++ cinema/urls.py | 16 +++++++----- cinema/views.py | 57 ++++++++++++++++++++----------------------- 4 files changed, 48 insertions(+), 37 deletions(-) create mode 100644 cinema/pagination.py diff --git a/cinema/pagination.py b/cinema/pagination.py new file mode 100644 index 00000000..57d8a6b6 --- /dev/null +++ b/cinema/pagination.py @@ -0,0 +1,7 @@ +from rest_framework.pagination import PageNumberPagination + + +class OrderSetPagination(PageNumberPagination): + page_size = 1 + page_query_param = "page_size" + max_page_size = 20 diff --git a/cinema/serializers.py b/cinema/serializers.py index 7d06c896..80d96c4f 100644 --- a/cinema/serializers.py +++ b/cinema/serializers.py @@ -85,6 +85,11 @@ class Meta: ) +class TicketRowAndSeatSerializer(serializers.ModelSerializer): + row = serializers.IntegerField() + seat = serializers.IntegerField() + + class MovieSessionDetailSerializer(MovieSessionSerializer): movie = MovieListSerializer(many=False, read_only=True) cinema_hall = CinemaHallSerializer(many=False, read_only=True) diff --git a/cinema/urls.py b/cinema/urls.py index 754f7330..43d6334b 100644 --- a/cinema/urls.py +++ b/cinema/urls.py @@ -11,12 +11,16 @@ ) router = routers.DefaultRouter() -router.register("genres", GenreViewSet) -router.register("actors", ActorViewSet) -router.register("cinema_halls", CinemaHallViewSet) -router.register("movies", MovieViewSet) -router.register("movie_sessions", MovieSessionViewSet) -router.register("orders", OrderViewSet) +router.register("genres", GenreViewSet, basename="genre") +router.register("actors", ActorViewSet, basename="actor") +router.register("cinema_halls", CinemaHallViewSet, basename="cinema_hall") +router.register("movies", MovieViewSet, basename="movie") +router.register( + "movie_sessions", + MovieSessionViewSet, + basename="movie_session" +) +router.register("orders", OrderViewSet, basename="order") urlpatterns = [path("", include(router.urls))] diff --git a/cinema/views.py b/cinema/views.py index 0a316bfd..595d2189 100644 --- a/cinema/views.py +++ b/cinema/views.py @@ -1,9 +1,9 @@ -from django.db.models import Count, F +from django.db.models import Count, F, QuerySet from rest_framework import viewsets -from rest_framework.pagination import PageNumberPagination from rest_framework.serializers import ModelSerializer from cinema.models import Genre, Actor, CinemaHall, Movie, MovieSession, Order +from cinema.pagination import OrderSetPagination from cinema.serializers import ( GenreSerializer, ActorSerializer, @@ -43,20 +43,21 @@ def _params_to_ints(query_string: str) -> queryset: return [int(str_id) for str_id in query_string.split(",")] def get_queryset(self): - queryset = super().get_queryset() - - actors = self.request.query_params.get("actors") - genres = self.request.query_params.get("genres") - titles = self.request.query_params.get("title") + queryset = self.queryset - if actors: - actors = self._params_to_ints(actors) - queryset = queryset.filter(actors__id__in=actors) - elif genres: - genres = self._params_to_ints(genres) - queryset = queryset.filter(genres__id__in=genres) - elif titles: - queryset = queryset.filter(title__icontains=titles) + if self.action == "list": + actors = self.request.query_params.get("actors") + genres = self.request.query_params.get("genres") + titles = self.request.query_params.get("title") + + if actors: + actors = self._params_to_ints(actors) + queryset = queryset.filter(actors__id__in=actors) + elif genres: + genres = self._params_to_ints(genres) + queryset = queryset.filter(genres__id__in=genres) + elif titles: + queryset = queryset.filter(title__icontains=titles) if self.action in ("list", "retrieve"): queryset = queryset.prefetch_related( @@ -81,19 +82,20 @@ class MovieSessionViewSet(viewsets.ModelViewSet): def get_queryset(self) -> queryset: queryset = super().get_queryset() + if self.action == "list": + date = self.request.query_params.get("date") + movie = self.request.query_params.get("movie") - date = self.request.query_params.get("date") - movie = self.request.query_params.get("movie") - - if date: - queryset = queryset.filter(show_time__date=date) - if movie: - queryset = queryset.filter(movie_id=movie) + if date: + queryset = queryset.filter(show_time__date=date) + if movie: + queryset = queryset.filter(movie_id=movie) if self.action in "list": queryset = ( queryset - .prefetch_related("movie", "cinema_hall", "tickets") + .select_related("movie", "cinema_hall") + .prefetch_related("tickets") .annotate( capacity=(F("cinema_hall__rows") * F("cinema_hall__seats_in_row")), @@ -118,17 +120,10 @@ def get_serializer_class(self) -> ModelSerializer: return MovieSessionSerializer -class OrderSetPagination(PageNumberPagination): - page_size = 1 - page_query_param = "page_size" - max_page_size = 20 - - class OrderViewSet(viewsets.ModelViewSet): - queryset = Order.objects.all() pagination_class = OrderSetPagination - def get_queryset(self) -> queryset: + def get_queryset(self) -> QuerySet: queryset = Order.objects.filter(user=self.request.user) if self.action == "list": From f1da45497e203b39a368d9dba3124343b672b2ba Mon Sep 17 00:00:00 2001 From: serhii Date: Fri, 11 Oct 2024 12:05:44 +0300 Subject: [PATCH 6/6] fix --- cinema/serializers.py | 15 ++++++++------- cinema/views.py | 1 - 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cinema/serializers.py b/cinema/serializers.py index 80d96c4f..b47a43df 100644 --- a/cinema/serializers.py +++ b/cinema/serializers.py @@ -86,23 +86,24 @@ class Meta: class TicketRowAndSeatSerializer(serializers.ModelSerializer): - row = serializers.IntegerField() - seat = serializers.IntegerField() + class Meta: + model = Ticket + fields = ("row", "seat") class MovieSessionDetailSerializer(MovieSessionSerializer): movie = MovieListSerializer(many=False, read_only=True) cinema_hall = CinemaHallSerializer(many=False, read_only=True) - taken_places = serializers.SerializerMethodField() + taken_places = TicketRowAndSeatSerializer( + many=True, + read_only=True, + source="tickets" + ) class Meta: model = MovieSession fields = ("id", "show_time", "movie", "cinema_hall", "taken_places") - def get_taken_places(self, obj: MovieSession) -> list[dict]: - tickets = Ticket.objects.filter(movie_session=obj) - return [{"row": ticket.row, "seat": ticket.seat} for ticket in tickets] - class TicketSerializer(serializers.ModelSerializer): movie_session = MovieSessionListSerializer() diff --git a/cinema/views.py b/cinema/views.py index 595d2189..4be6d4de 100644 --- a/cinema/views.py +++ b/cinema/views.py @@ -91,7 +91,6 @@ def get_queryset(self) -> queryset: if movie: queryset = queryset.filter(movie_id=movie) - if self.action in "list": queryset = ( queryset .select_related("movie", "cinema_hall")