2017-01-31 2 views
4

У меня есть несколько вопросов об этой теме: https://groups.google.com/forum/#!topic/wagtail-developers/Z4oaCIJXYuIПользовательское представления Streamfield в API отдыха

Я строй обезглавленного трясогузка, с Реагировать на основе интерфейса, который вызывает трясогузку API для того, чтобы разобрать JSON и отображение контента , Довольно простой.

Мне было интересно, можно ли настраивать вывод streamfield в API для отдыха. Несколько примеров:

Как Я прочитал в теме, приведенной выше, Wagtail API v1 не был готов для пользовательского представления Streamfield в нем. Это изменилось с тех пор, как v2? (Я не заметил ничего связанного с изменениями) Если нет, есть ли у кого-нибудь какие-то подсказки о том, как я мог бы достичь такого?

Я уже планировал создать пользовательскую модель изображения, чтобы получить URL-адрес, вызвав api/v2/images/id, но я хотел бы получить все это в один ответ JSON.

Большое спасибо заранее, С уважением

ответ

4

по состоянию Wagta il 1.9, вы можете изменить представление API блока в StreamField, переопределив метод get_api_representation() в блоке.

Для примера мы можем переопределить метод на самом 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()) 
    ]) 

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

+0

спасибо за подсветку синтаксиса @lightstrike – probabble

1

Это не является прямым ответом на ваш вопрос, но содержание магазина приложений NHS решает подобные проблемы и может быть полезным справочным:

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

в частности

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

+0

Большое спасибо за эту ссылку, никогда не видел ее раньше. Я немного покопаю его и вернусь сюда, если найду что-то, что решает мою проблему. –

1

Добавление на very helpful answer по probabble, вы можете также использовать get_rendition внутри StreamField блока путем добавления 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) 

В этом примере мы возвращаем только t itle и url изображения.

Смежные вопросы