Search code examples
djangodjango-modelsdjango-rest-frameworkdjango-serializer

adding a foreignkey set to serializer in django rest framework


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

Solution

  • 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',)