我对这个帖子有几个问题: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响应。
答案 0 :(得分:6)
从Wagtail 1.9开始,您可以通过覆盖块上的BetterB
方法来修改StreamField中块的API表示。
对于您的示例,我们可以覆盖ImageChooserBlock本身的方法:
get_api_representation()
答案 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)
在此示例中,我们仅返回图像的标题和网址。