Определение пользовательского поля Serializer Field для связанных моделей дает TypeError

Мой вопрос похож на этот вопрос без ответа.

Я пытаюсь внедрить поле serializer в свой проект. Я столкнулся с проблемой, когда мне нужно вложить другие модели в один запрос, но при этом возникает ошибка TypeError: Object of type ____ is not serializable.

Вот как выглядит псевдокод моего models.py кода:
(GameIndexPage имеет много GameBlogPage имеет один Game)
(Я опустил то, что считаю несущественным)

@register_snippet
class Game(models.Model):
    title = models.CharField(max_length=150)

    def __str__(self):
        return self.title

class GameBlogPage(Page):
    parent_page_type = ['blog.GameIndexPage']

    introduction = models.TextField

    game = models.ForeignKey 'web_api.Game'

    album_image = models.ForeignKey 'wagtailimages.Image'
    
    body = StreamField([
        ('heading', blocks.CharBlock(form_classname="full title")),
        ('paragraph', blocks.RichTextBlock()),
        ('image', ImageChooserBlock()),
    ])
    published_date = models.DateTimeField()

class GameIndexPage(Page):
    subpage_types = ['GameBlogPage']

    parent_page_type = ['home.HomePage']

    introduction = RichTextField
    image = models.ForeignKey 'wagtailimages.Image'
    @property
    def children(self):
        return self.get_children().specific().public().live()
    ...
    api_fields = [
        APIField('introduction'),
        APIField('image'),
        APIField('children', serializer=GameBlogPageField())
    ]

Теперь, вот моя реализация поля сериализатора в fields.py:

class GameBlogPageField(Field):

    def to_representation(self, queryset):
        pages = []
        for child in queryset:

            post_dict = {
                "id": child.id,
                "title": child.title,
                "introduction": child.introduction,
                "game": child.game # where it all goes wrong
                #"blog_authors": child.blog_authors,
                #"published_date": child.published_date,
                #"album_image": child.album_image,
            }
            pages.append(post_dict)
        return pages

Удаление игрового значения дает такой результат. Я закомментировал, куда я хочу поместить вложенные данные.

    "items": [
        {
            "id": 6,
            "meta": {
                "type": "blog.GameIndexPage",
                ...
            },
            "title": "My Favorite Games of All Time",
            "introduction": "...",
            "image": {
                "url": "/media/original_images/_hkdd3HTVIc.jpg",
                "title": "FavGameBanner",
                "width": 1920,
                "height": 1080
            },
            "children": [
                {
                    "id": 7,
                    "title": "...",
                    "introduction": "...",
                    "game": [] <--- I don't know of a clean way to serialize the Game object here.
                },
                {
                    "id": 9,
                    "title": "...",
                    "introduction": "...",
                    "game": [] <--- I don't know of a clean way to serialize the Game object here.
                }
            ]
        }
    ]

Мое грязное решение заключается в том, чтобы вручную создать объект в fields.py и добавить в них значения:

class GameBlogPageField(Field):

    def to_representation(self, queryset):
        ...
            post_dict = {
                "id": child.id,
                "title": child.title,
                "introduction": child.introduction,
                "game": {
                    "id": child.game.id,
                    "title": child.game.title
                }
                #"blog_authors": child].blog_authors,
                #"published_date": child.published_date,
                #"album_image": child.album_image,
            }
            pages.append(post_dict)
        return pages

Но я не вижу, чтобы это работало для отношений один-ко-многим и многие-ко-многим. К сожалению, единственное, что я исследовал, это вопрос без ответа, на который я ссылался выше.

Что мне делать?

Вернуться на верх