Как в serializers вывести поля из дочерних моделей
Всем доброго дня! У меня есть следующая проблема. Я пишу проект с выводом разного типа контента. Модели реализованы следующим образом:
from django.db import models
from django.shortcuts import reverse
class Page(models.Model):
title = models.CharField(verbose_name='Название', max_length=65)
def __str__(self):
return self.title
class Meta:
verbose_name = 'Страница'
verbose_name_plural = 'Страницы'
def get_absolute_url(self):
return reverse('detail_content', kwargs={'pk': self.pk})
class Content(models.Model):
title = models.CharField(verbose_name='Название', max_length=65)
counter = models.PositiveIntegerField(verbose_name='Кол-во просмотров', default=0)
page = models.ForeignKey(Page, verbose_name='Страница', on_delete=models.CASCADE, related_name='content')
position = models.PositiveSmallIntegerField(verbose_name='Позиция', default=0)
def __str__(self):
return self.title
class VideoContent(Content):
video_link = models.CharField(verbose_name='Ссылка на видео', max_length=2048) # Такая большая макс.длина поля
sub_link = models.CharField(verbose_name='Ссылка на субтитры', max_length=2048, # на случай очень длиной ссылки
blank=True, null=True)
class Meta:
verbose_name = 'Видеофайл'
verbose_name_plural = 'Видеофайлы'
class AudioContent(Content):
bpm = models.PositiveSmallIntegerField(verbose_name='Кол-во bpm')
class Meta:
verbose_name = 'Аудиофайл'
verbose_name_plural = 'Аудиофайлы'
class TextContent(Content):
text = models.TextField(verbose_name='Текст')
class Meta:
verbose_name = 'Текст'
verbose_name_plural = 'Тексты'
У нас есть модель Page, в которой кроме тайтла ничего нет, есть модель Content, которая по FK связана с ней. От Content наследуются модели с типами контента (Видео, аудио, текст). В данный момент пытаюсь вывести в serializers детальную информацию о выбранной странице, но у меня вывод не такой, какой я ожидаю
Вот, собственно сериализаторы:
from rest_framework import serializers
from .models import Page, Content
class PageListSerializer(serializers.ModelSerializer):
def get_link(self, obj):
return 'http://127.0.0.1:8000' + obj.get_absolute_url()
link = serializers.SerializerMethodField()
class Meta:
model = Page
fields = ('pk', 'link')
class ContentSerializer(serializers.ModelSerializer):
class Meta:
model = Content
fields = '__all__'
class PageDetailSerializer(serializers.ModelSerializer):
content = ContentSerializer(source='content.all', many=True)
class Meta:
model = Page
fields = ('pk', 'title', 'content')
Но вместо всех ссылок, текстов и т.д я получаю вот такой ответ:
{
"pk": 1,
"title": "Страница 1",
"content": [
{
"id": 1,
"title": "Видео 1",
"counter": 0,
"position": 1,
"page": 1
},
{
"id": 2,
"title": "Аудио 1",
"counter": 0,
"position": 3,
"page": 1
},
{
"id": 3,
"title": "Текст 1",
"counter": 0,
"position": 2,
"page": 1
}
]
}
Как я могу получить поля из дочерних моделей, ссылаясь только на родительскую? Или может есть еще какой-либо способ?