我对这个帖子有几个问题:https://groups.google.com/forum/#!topic/wake- developer/Z4oaCIJXYuI
我正在构建一个无头Wagtail,带有一个基于React的前端,它调用Wagtail API来解析JSON并显示内容.很基本的.
我想知道是否可以在rest API中自定义streamfield的输出.几个例子:
正如我在上面链接的主题中所读到的,Wagtail API v1还没有准备好在其中自定义Streamfield表示.自v2以来它有变化吗?(我没有注意到在更改日志中有任何相关内容)如果没有,是否有人有关于如何实现这样的事情的一些提示?
我已经计划构建一个自定义图像模型来通过调用获取URL api/v2/images/id,但我希望将所有这些都集成到一个JSON响应中.
从Wagtail 1.9开始,您可以通过覆盖get_api_representation()块上的方法来修改StreamField中块的API表示.
对于您的示例,我们可以覆盖ImageChooserBlock本身的方法:
class ImageSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = wagtail.wagtailimages.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.wagtailsnippets.models.register_snippet
class MySnippetForAPI(models.Model):
title = models.CharField(max_length=80)
content = StreamField([
('heading', blocks.CharBlock()),
('paragraph', blocks.RichTextBlock()),
('image', APIImageChooserBlock())
])
Run Code Online (Sandbox Code Playgroud)
添加probabble非常有用的答案,您还可以通过添加以下内容在 StreamField 块内使用get_renditionSerializerMethodField:
# 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)
Run Code Online (Sandbox Code Playgroud)
在此示例中,我们仅返回图像的标题和 url。