在 django rest 框架中将外键集添加到序列化程序

adding a foreignkey set to serializer in django rest framework

我正在制作一个与电影相关的网站,嗯,每部电影或电视节目都有一些预告片视频。 我有两个模型,看起来像下面提供的代码。我需要制作一个 API 来检索包含所有详细信息的电影实例。我已经完成了所需的一切,唯一剩下的就是返回预告片视频的详细信息。

预告片模型有一个指向与其相关的电影的外键字段。但我不知道如何将每部电影的视频详细信息添加到检索实例 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',)