Добавление набора иностранных ключей в сериализатор в django rest framework

Я создаю сайт, связанный с кино, и у каждого фильма или телешоу есть несколько трейлеров. У меня есть две модели, которые выглядят так, как показано ниже. Мне нужно сделать API, который извлекает экземпляр фильма со всеми его деталями. Я сделал все необходимое для этого, осталось только вернуть детали трейлеров к фильму.

В модели трейлера есть поле foreignkey, которое указывает на фильм, к которому он относится. но я не знаю, как я могу добавить информацию о видео каждого фильма в retrieve instance api.

Есть идеи, как я могу это сделать?

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

нужно создать сериализатор видео и добавить его к полям в filmretrieveserializer.

class VideoSerializer(serializer.ModelSerializer):
      class Mete:
            model = Video
            fields = ()
class FilmRetrieveSerializer(serializers.ModelSerializer):
    videos = VideoSerilazer(many=true, read_only=true)
    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',)

Мне пришлось добавить сериализатор для видео, а также установить его источником кверисет video_set!!!

 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',)
Вернуться на верх