Как сериализовать Streamblock в Wagtail?
У меня есть следующий код
from apps.home.utils.blocks import get_internal_page_api_representation
from django.utils.translation import ugettext_lazy as _ # NOQA
from wagtail.core import blocks
from apps.home.blocks.image_chooser_block import ImageChooserBlock
class NavColumnBlock(blocks.StructBlock):
"""A Nav Column block with title and internal sublinks"""
title = blocks.CharBlock(
max_length=100,
help_text=_('Title of the linked page (max. 45 chars)'),
)
link = blocks.PageChooserBlock(
required=True,
help_text=_('Link to the page')
)
sublinks = blocks.StreamBlock([
('icon', ImageChooserBlock(required=True, min_num=1, max_num=1, help_text=_('Icon of a subpage'))),
('sublink', blocks.PageChooserBlock(required=True, min_num=1, max_num=1, help_text=_('Link to a subpage')))
], min_num=1, max_num=6)
def get_api_representation(self, value, context=None):
"""Tweaks the API representation so it contains the serialized data"""
linked_page = value.get('link', None)
sublinks = value.get('sublinks', [])
sublinks_child_blocks = self.child_blocks.get('sublinks')
return {
'title': value.get('title', ''),
'link': get_internal_page_api_representation(linked_page),
'sublinks': sublinks_child_blocks.get_api_representation(
sublinks) if sublinks_child_blocks else [],
}
class Meta:
icon = 'placeholder'
label = _('Column')
Цель: мне нужно, чтобы каждый объект внутри массива sublinks содержал иконку и url. Сейчас я добавил один тестовый объект, и value не имеет нужного мне содержимого.
Проблема: В представлении api я вижу, что value объект внутри массива sublinks должен быть сериализован.
(Изображение ниже)
Теперь value просто показывает мне число, вероятно, количество элементов (id, icon и url).
Когда я пытаюсь перебрать все элементы, чтобы получить каждый дочерний, он выдает ошибку. Ниже приведен мой сериализатор, в котором я успешно сериализовал другие данные. (S. закомментированный фрагмент ниже, который дает мне ошибку).
class MenuPagesSerializer(PageSerializer):
"""A serializer for menu pages. Adds child pages to their representation."""
def to_representation(self, instance):
"""
Overwrites PageSerializer.to_representation.
Adds child pages to the representation.
"""
from apps.home.models.menu_page import MenuPage
rep = super().to_representation(instance)
rep['children'] = instance.get_children().public().live().in_menu().values("id", "title", "slug")
if (isinstance(instance.specific, MenuPage)):
navigation_suggestion = getattr(
getattr(instance.specific.navigation_suggestion, 'stream_data', None), 'stream_value', None)
rep['navigation_suggestion'] = [
get_stream_child_block_api_representation(stream_child) for stream_child
in navigation_suggestion
]
navigation_suggestion_left = getattr(
getattr(instance.specific.navigation_suggestion_left, 'stream_data', None), 'stream_value', None)
rep['navigation_suggestion_left'] = [
get_stream_child_block_api_representation(stream_child) for stream_child
in navigation_suggestion_left
]
rep_sublinks = rep['navigation_suggestion_left'][0]['value']['sublinks']
# rep_sublinks = [
# get_stream_child_block_api_representation(stream_child) for stream_child
# in rep_sublinks
# ]
for stream_item in rep_sublinks:
print(stream_item['value'])
return rep
Есть ли правильный способ или метод, как это можно сделать?
