Добавление набора иностранных ключей в сериализатор в 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',)