在 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',)
我正在制作一个与电影相关的网站,嗯,每部电影或电视节目都有一些预告片视频。 我有两个模型,看起来像下面提供的代码。我需要制作一个 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',)