在rest API中自定义Streamfield的表示形式

时间:2017-01-31 11:43:17

标签: api wagtail

我对这个帖子有几个问题:https://groups.google.com/forum/#!topic/wagtail-developers/Z4oaCIJXYuI

我正在使用基于React的前端构建无头Wagtail,它调用Wagtail API以解析JSON并显示内容。很基本的。

我想知道是否可以在rest API中自定义streamfield的输出。几个例子:

正如我在上面链接的主题中所读到的,Wagtail API v1还没有准备好在其中自定义Streamfield表示。 自v2以来它有变化吗? (我没有注意到更改日志中的任何相关内容) 如果没有,有没有人有一些关于如何实现这一目标的提示?

我已经计划通过调用api/v2/images/id构建一个自定义图像模型来获取URL,但我希望将所有这些转换为一个JSON响应。

3 个答案:

答案 0 :(得分:6)

从Wagtail 1.9开始,您可以通过覆盖块上的BetterB方法来修改StreamField中块的API表示。

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

get_api_representation()

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

答案 1 :(得分:2)

这不是您问题的直接答案,但NHS内容商店应用程序正在解决类似的问题,可能是一个有用的参考:

https://github.com/nhsuk/nhsuk-content-store

特别是

https://github.com/nhsuk/nhsuk-content-store/blob/master/api/serializers.py

答案 2 :(得分:1)

通过very helpful answer添加到probabble,您还可以在StreamField块中使用get_rendition添加SerializerMethodField

# serializers.py
# Explicitly importing since models are not loaded when serializers initialized

from wagtail.wagtailimages.models import Image as WagtailImage

class WagtailImageSerializer(serializers.ModelSerializer):
    url = serializers.SerializerMethodField()

    class Meta:
        model = WagtailImage
        fields = ['title', 'url']

    def get_url(self, obj):
        return obj.get_rendition('fill-300x186|jpegquality-60').url

# blocks.py

from .serializers import WagtailImageSerializer 

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

在此示例中,我们仅返回图像的标题和网址。