Как сериализовать модель Wagtail Orderable? - PullRequest
1 голос
/ 23 апреля 2020

Я столкнулся с проблемой, о которой я также собираюсь написать в блоге. Я нашел решение, но, поскольку я собираюсь написать об этом, мне интересно, существует ли лучший способ сериализации заказываемой модели .

Контекст: Моя модель 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']

Есть ли лучший подход для сериализации этого поля? Заранее большое спасибо!

...