I am making a movie-related website and well, every movie or tv show has some trailer videos. I have two models which look like the code provided below. I need to make an API which retrieves an instance of a movie with all it's details. I have done everything that's needed for that and the only thing remaining is returning the details of the trailer videos.
The trailer model has a foreignkey field which points to the movie its related to. but I dont know how I can add each movie's video details to the retrieve instance api.
Any idea on how I could do that?
Models.py
class Film(models.Model):
filmID = models.AutoField(primary_key=True)
title = models.CharField(max_length=150)
price = models.PositiveIntegerField()
seasons = models.IntegerField(default=1)
duration = models.PositiveIntegerField()
statusOf = models.IntegerField(default=1, validators=[MaxValueValidator(4), MinValueValidator(1),])
typeOf = models.IntegerField(validators=[MaxValueValidator(4), MinValueValidator(1),])
numberOfFilminoRatings = models.PositiveIntegerField(default=0)
filminoRating = models.IntegerField(default=0, validators=[MaxValueValidator(10), MinValueValidator(0),])
rating = models.IntegerField(default=0, validators=[MaxValueValidator(10), MinValueValidator(0),])
releaseDate = models.DateTimeField(null=True)
details = models.TextField()
salePercentage = models.PositiveIntegerField(default=0)
saleExpiration = models.DateTimeField(auto_now_add=True)
filmGenre = models.ManyToManyField(Genre)
filmActor = models.ManyToManyField(Celebrity, related_name='actor')
filmDirector = models.ManyToManyField(Celebrity, related_name='director')
filmProducer = models.ManyToManyField(Celebrity, related_name='producer')
def __str__(self):
return f"{self.title} {self.releaseDate.strftime('%Y')}"
class Video(models.Model):
videoID = models.AutoField(primary_key=True)
duration = models.PositiveIntegerField()
qualityHeight = models.PositiveIntegerField()
qualityWidth = models.PositiveIntegerField()
sizeOf = models.PositiveIntegerField()
directoryLocation = models.TextField()
film = models.ForeignKey(Film, null=True, on_delete=models.SET_NULL)
Serializers.py
class FilmRetrieveSerializer(serializers.ModelSerializer):
class Meta:
model = Film
fields = ('filmID', 'title', 'price', 'seasons', 'duration',
'statusOf', 'typeOf', 'numberOfFilminoRatings', 'filminoRating',
'rating', 'releaseDate', 'details', 'salePercentage', 'saleExpiration',
'filmGenre', 'filmActor', 'filmDirector', 'filmProducer')
read_only_fields = ('filmID',)
Views.py
class FilmRetrieveViewSet(RetrieveUpdateDestroyAPIView):
serializer_class = serializers.FilmRetrieveSerializer
queryset = Film.objects.all()
lookup_field = 'filmID'
def get_queryset(self):
return self.queryset
I had to add a serializer for the videos and also set its source to be the video_set queryset!!
class VideoSerializer(serializer.ModelSerializer):
class Mete:
model = Video
fields = ()
class FilmRetrieveSerializer(serializers.ModelSerializer):
videos = VideoSerilazer(many=true, read_only=true, source='video_set') #SOURCE ADDED
class Meta:
model = Film
fields = ('filmID', 'title', 'price', 'seasons', 'duration',
'statusOf', 'typeOf', 'numberOfFilminoRatings', 'filminoRating',
'rating', 'releaseDate', 'details', 'salePercentage', 'saleExpiration',
'filmGenre', 'filmActor', 'filmDirector', 'filmProducer', 'videos')
read_only_fields = ('filmID',)