Как JSON сериализовать APIField StreamField, используя ListBlocks of PageChooserBlocks - PullRequest
0 голосов
/ 24 февраля 2020

Привет, ребята, моя голова кружится, пытаясь понять это. Я не могу получить ответ от API Streamfield с помощью Blocks.PageChooserBlock. Мне нужно десериализовать JSON, но у меня нет сока.

Я получаю эту ошибку Object of type 'TimelineEvent' is not JSON serializable

Это страница

class Timeline(Page):
    content = StreamField([
        ('title', blocks.CharBlock(classname="full title")),
        ('time_period', TimePeriodBlock())
    ])
    content_panels = Page.content_panels + [
        StreamFieldPanel('content')
    ]
    api_fields = [
        APIField("title"),
        APIField("content")
    ]

Я могу чтобы получить данные из TimePeriodBlock, и это выглядит так

class TimePeriodBlock(blocks.StructBlock):
    def get_api_representation(self, value, context=None):
        dict_list = []
        for item in value:
            temp_dict = {
                'period_name': value.get("period_name"),
                'description': value.get("description"),
                'duration': value.get("duration"),
                'events': value.get('events')
            }
            print(value.get('events'))
            dict_list.append(temp_dict)
            return dict_list
    period_name = blocks.CharBlock()
    description = blocks.CharBlock()
    duration = blocks.CharBlock()
    events = blocks.ListBlock(EventBlock())

НО не может быть где-нибудь рядом с EventBlock

class EventBlock(blocks.StructBlock):
    def get_api_representation(self, value, context=None):
        dict_list = []
        print('here')
        print(value)
        for item in value:
            temp_dict = {
                # 'event': item.get("event"),
                'short_desc': item.get("short_desc"),
            }
            dict_list.append(temp_dict)
            print(dict_list)
        return dict_list
    event = blocks.PageChooserBlock(page_type=TimelineEvent)
    short_desc = blocks.CharBlock(max_length=250)

Событие выглядит так [StructValue([('event', <TimelineEvent: Dance 1700 fandango and jota >), ('short_desc', 'first event')]), StructValue([('event', <TimelineEvent: Dance 1700 contredanse>), ('short_desc', '2nd event')])]

[StructValue([('event', <TimelineEvent: Dance 1937 Trudl Dubsky>), ('short_desc', '3rd')])]

1 Ответ

0 голосов
/ 24 февраля 2020

value.get(...) просто даст вам родное значение дочернего блока, а не представление API. Чтобы получить это, вам нужно вызвать get_api_representation в дочернем блоке:

        temp_dict = {
            'period_name': value.get("period_name"),
            'description': value.get("description"),
            'duration': value.get("duration"),
            'events': self.child_blocks['events'].get_api_representation(value.get("events"))
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...