Определение пользовательского поля 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
Но я не вижу, чтобы это работало для отношений один-ко-многим и многие-ко-многим. К сожалению, единственное, что я исследовал, это вопрос без ответа, на который я ссылался выше.
Что мне делать?