Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

solution #734

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion cinema/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,12 @@ class Actor(models.Model):
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)

@property
def full_name(self):
return self.__str__()

def __str__(self):
return self.first_name + " " + self.last_name
return f"{self.first_name} {self.last_name}"


class Movie(models.Model):
Expand Down
68 changes: 67 additions & 1 deletion cinema/serializers.py
Original file line number Diff line number Diff line change
@@ -1 +1,67 @@
# write serializers here
from rest_framework import serializers
from .models import Actor, CinemaHall, Genre, Movie, MovieSession, Order, \
Ticket


class ActorSerializer(serializers.ModelSerializer):
class Meta:
model = Actor
fields = ["id", "first_name", "last_name", "full_name"]


class GenreSerializer(serializers.ModelSerializer):
class Meta:
model = Genre
fields = ["id", "name"]


class MovieSerializer(serializers.ModelSerializer):
class Meta:
model = Movie
fields = ["id", "title", "description", "duration", "genres", "actors"]


class MovieListSerializer(MovieSerializer):
genres = serializers.SlugRelatedField(
many=True, read_only=True, slug_field="name"
)
actors = serializers.SlugRelatedField(
many=True, read_only=True, slug_field="full_name"
Comment on lines +28 to +29

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The actors field in MovieListSerializer uses SlugRelatedField with slug_field='full_name'. However, full_name is a property, not a model field, which will cause an error. Consider using a SerializerMethodField to serialize the full name instead.

)
Comment on lines +28 to +30

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The SlugRelatedField with slug_field='full_name' is incorrect because full_name is a property, not a model field. Use a SerializerMethodField to serialize the actor's full name.



class MovieDetailSerializer(MovieSerializer):
genres = GenreSerializer(many=True, read_only=True)
actors = ActorSerializer(many=True, read_only=True)


class CinemaHallSerializer(serializers.ModelSerializer):
class Meta:
model = CinemaHall
fields = ["id", "name", "rows", "seats_in_row", "capacity"]


class MovieSessionSerializer(serializers.ModelSerializer):
class Meta:
model = MovieSession
fields = ["id", "show_time", "movie", "cinema_hall"]


class MovieSessionListSerializer(MovieSessionSerializer):
movie_title = serializers.CharField(source="movie.title", read_only=True)
cinema_hall_name = serializers.CharField(
source="cinema_hall.name", read_only=True
)
cinema_hall_capacity = serializers.IntegerField(
source="cinema_hall.capacity", read_only=True
)

class Meta:
model = MovieSession
fields = ["id", "show_time", "movie_title", "cinema_hall_name",
"cinema_hall_capacity"]


class MovieSessionDetailSerializer(MovieSessionSerializer):
movie = MovieListSerializer(read_only=True)
cinema_hall = CinemaHallSerializer(read_only=True)
17 changes: 16 additions & 1 deletion cinema/urls.py
Original file line number Diff line number Diff line change
@@ -1 +1,16 @@
# write urls here
from django.urls import path, include
from rest_framework import routers

from cinema.views import GenreViewSet, ActorViewSet, CinemaHallViewSet, \
MovieViewSet, MovieSessionViewSet

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)

urlpatterns = [
path("", include(router.urls)),
]
44 changes: 43 additions & 1 deletion cinema/views.py
Original file line number Diff line number Diff line change
@@ -1 +1,43 @@
# write views here
from rest_framework import viewsets
from cinema.models import Genre, Actor, CinemaHall, Movie, MovieSession
from cinema.serializers import GenreSerializer, ActorSerializer, \
CinemaHallSerializer, MovieSerializer, MovieSessionSerializer, \
MovieListSerializer, MovieDetailSerializer, MovieSessionListSerializer, \
MovieSessionDetailSerializer


class GenreViewSet(viewsets.ModelViewSet):
queryset = Genre.objects.all()
serializer_class = GenreSerializer


class ActorViewSet(viewsets.ModelViewSet):
queryset = Actor.objects.all()
serializer_class = ActorSerializer


class CinemaHallViewSet(viewsets.ModelViewSet):
queryset = CinemaHall.objects.all()
serializer_class = CinemaHallSerializer


class MovieViewSet(viewsets.ModelViewSet):
queryset = Movie.objects.prefetch_related("actors", "genres")

def get_serializer_class(self):
if self.action == "list":
return MovieListSerializer
elif self.action == "retrieve":
return MovieDetailSerializer
return MovieSerializer


class MovieSessionViewSet(viewsets.ModelViewSet):
queryset = MovieSession.objects.select_related("movie", "cinema_hall")

def get_serializer_class(self):
if self.action == "list":
return MovieSessionListSerializer
elif self.action == "retrieve":
return MovieSessionDetailSerializer
return MovieSessionSerializer
3 changes: 2 additions & 1 deletion cinema_service/urls.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.contrib import admin
from django.urls import path
from django.urls import path, include

urlpatterns = [
path("admin/", admin.site.urls),
path("api/cinema/", include("cinema.urls")),
]
Loading