簡體   English   中英

在 django rest 框架中將外鍵集添加到序列化程序

[英]adding a foreignkey set to serializer in django rest framework

我正在制作一個與電影相關的網站,而且,每部電影或電視節目都有一些預告片。 我有兩個模型,看起來像下面提供的代碼。 我需要制作一個 API 來檢索包含所有詳細信息的電影實例。 我已經完成了所需的一切,剩下的唯一一件事就是返回預告片視頻的詳細信息。

預告片 model 有一個外鍵字段指向與其相關的電影。 但我不知道如何將每部電影的視頻詳細信息添加到檢索實例 api。

知道我該怎么做嗎?

模型.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)

序列化程序.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',)

視圖.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',)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM