【问题标题】:How to serialize a Wagtail Orderable model?如何序列化 Wagtail 可订购模型?
【发布时间】:2020-04-23 11:12:40
【问题描述】:

我遇到了一个挑战,我也打算写博客。我找到了一个解决方案,但由于我要写这篇文章,我想知道是否有更好的方法来序列化 Orderable 模型

上下文:我的LessonPage(Page) 模型有一个LessonPageDocuments(Orderable) 模型,它允许用户将多个文档添加到特定的课程页面:

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'),
    ]

现在,由于这个项目的需要和业务需求,我们正在创建一个自定义 REST API,而不是使用 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']

有没有更好的方法来序列化这个字段? 提前非常感谢您!

【问题讨论】:

    标签: python django-rest-framework wagtail


    【解决方案1】:

    我认为(据我所知)做得更好的唯一方法是使其可重复使用:

    wagtail_api/serializers.py

    from wagtail.documents.api.v2.serializers import DocumentDownloadUrlField
    from wagtail.documents.models import Document
    
    class DocumentSerializer(serializers.ModelSerializer):
        _detail_url = serializers.HyperlinkedIdentityField(view_name='api:wagtail:documents:detail')
        download_url = DocumentDownloadUrlField()
    
        class Meta:
            model = Document
            fields = (
                '_detail_url',
                'id', 'title', 'download_url',
            )
    

    my_app/serializers.py

    class SomePageDocumentSerializer(serializers.ModelSerializer):
        description = RichTextAPIField()
        document = DocumentSerializer()
    
        class Meta:
            model = SomePage
            fields = ('description', 'document')
    

    也可能有一种方法可以覆盖 wagtails DocumentSerializer from ee_wagtail.apps.wagtail_api.serializers

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-30
      • 2017-07-21
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      相关资源
      最近更新 更多