gpt4 book ai didi

api - REST API中Streamfield的自定义表示

转载 作者:行者123 更新时间:2023-12-04 06:15:48 24 4
gpt4 key购买 nike

我对此线程有一些疑问:https://groups.google.com/forum/#!topic/wagtail-developers/Z4oaCIJXYuI

我正在构建一个基于React的前端 headless Wagtail,该Wagtail调用Wagtail API来解析JSON和显示内容。很基本的。

我想知道是否有可能在rest API中自定义流字段的输出。几个例子:

  • 从wagtaildemo中基于此示例获取图像URL:https://github.com/wagtail/wagtaildemo/blob/api-tweaks/demo/models.py#L713-L716(我认为它适用于单个URL)
  • PageChooserBlock:从目标页面
  • 中获取字段

    正如我在上面链接的主题中所阅读的那样,Wagtail API v1尚未准备好在其中进行Streamfield的自定义表示。
    从v2开始,它有变化吗? (我没有发现变更日志中有任何相关内容)
    如果没有,是否有人对我如何实现这样的目标有一些提示?

    我已经计划构建一个自定义图像模型来通过调用 api/v2/images/id来获取URL,但是我很想将所有这些信息整合到一个JSON响应中。

    最佳答案

    从Wagtail 1.9开始,您可以通过覆盖Block上的get_api_representation()方法,在StreamField中修改Block的API表示形式。

    对于您的示例,我们可以覆盖ImageChooserBlock本身的方法:

    import wagtail 
    from rest_framework import serializers

    class ImageSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
    model = wagtail.images.get_image_model()
    fields = ['title', 'file', 'width', 'height', 'file_size']

    class APIImageChooserBlock(ImageChooserBlock):
    def get_api_representation(self, value, context=None):
    return ImageSerializer(context=context).to_representation(value)

    @wagtail.snippets.models.register_snippet
    class MySnippetForAPI(models.Model):
    title = models.CharField(max_length=80)
    content = StreamField([
    ('heading', blocks.CharBlock()),
    ('paragraph', blocks.RichTextBlock()),
    ('image', APIImageChooserBlock())
    ])

    针对Wagtail 2.0+的代码已更新

    https://github.com/wagtail/wagtail/blob/b6ee2db6ac8dbf4b47a81f4b2684b7aca8cc2501/wagtail/wagtailcore/blocks/base.py#L244

    关于api - REST API中Streamfield的自定义表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41956709/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com