Я столкнулся с проблемой, о которой я также собираюсь написать в блоге. Я нашел решение, но, поскольку я собираюсь написать об этом, мне интересно, существует ли лучший способ сериализации заказываемой модели .
Контекст: Моя модель LessonPage(Page)
имеет модель LessonPageDocuments(Orderable)
, которая позволит пользователям добавлять несколько документов в определенную страницу Lesson:
class LessonPageDocuments(Orderable):
page = ParentalKey(LessonPage, on_delete=models.CASCADE,
related_name='documents')
document = models.ForeignKey(
'wagtaildocs.Document', on_delete=models.CASCADE, related_name='+'
)
panels = [
DocumentChooserPanel('document'),
]
Теперь, в связи с потребностями этого проекта и бизнес-требованиями, мы создаем пользовательский API REST вместо использования Wagtail. API.
И способ, которым я обнаружил сериализацию поля documents
, заключался в следующем:
class LessonDetailsSerializer(serializers.ModelSerializer):
content = RichTextSerializer()
documents = serializers.SerializerMethodField()
def to_representation(self, instance):
ret = super().to_representation(instance)
video_url = ret['video_url']
ret['video_url'] = get_embed(video_url).html if video_url else ''
return ret
def get_documents(self, lesson):
"""Return serialized document fields and file URL"""
request = self.context.get('request')
doc_list = []
for doc_cluster in lesson.documents.all():
doc_list.append({
"url": request.build_absolute_uri(doc_cluster.document.file.url),
"title": doc_cluster.document.title,
"id": doc_cluster.document.pk,
})
return doc_list
class Meta:
model = LessonPage
fields = ['id', 'title', 'slug', 'description',
'video_url', 'content', 'documents']
Есть ли лучший подход для сериализации этого поля? Заранее большое спасибо!