【问题标题】:Custom representation of Streamfield in rest APIREST API 中 Streamfield 的自定义表示
【发布时间】:2017-01-31 11:43:17
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: api wagtail


    【解决方案1】:

    从 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

    【讨论】:

      【解决方案2】:

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

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

      在这个例子中,我们只返回图片的标题和网址。

      【讨论】:

      • 帮助解决了我的“未加载模型”问题,谢谢 :)
      【解决方案3】:

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

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

      特别是

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-06
        • 2020-09-01
        • 2021-10-31
        • 2017-09-23
        • 2018-11-08
        • 1970-01-01
        • 2015-11-07
        • 1970-01-01
        相关资源
        最近更新 更多