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

fab*_*eux 8 api wagtail

我对这个帖子有几个问题: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响应中.

pro*_*ble 8

从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)

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


lig*_*ike 5

添加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。