Сериализатор сниппетов Django/Wagtail в API
Я добавил автора блога wagtail CMS в свой 'models.py', также выставил его в API, но в API он показывает следующее
"blog_authors": [
{
"id": 1,
"meta": {
"type": "blog.BlogAuthorsOrderable"
}
}
],
Вот код models.py
class BlogAuthorsOrderable(Orderable):
"""This allows us to select one or more blog authors from Snippets."""
page = ParentalKey("blog.AddStory", related_name="blog_authors")
author = models.ForeignKey(
"blog.BlogAuthor",
on_delete=models.CASCADE,
)
panels = [
# Use a SnippetChooserPanel because blog.BlogAuthor is registered as a snippet
SnippetChooserPanel("author"),
]
@register_snippet
class BlogAuthor(models.Model):
"""Blog author for snippets."""
name = models.CharField(max_length=100)
website = models.URLField(blank=True, null=True)
image = models.ForeignKey(
"wagtailimages.Image",
on_delete=models.SET_NULL,
null=True,
blank=False,
related_name="+",
)
panels = [
MultiFieldPanel(
[
FieldPanel("name"),
# Use an ImageChooserPanel because wagtailimages.Image (image property)
# is a ForeignKey to an Image
ImageChooserPanel("image"),
],
heading="Name and Image",
),
MultiFieldPanel(
[
FieldPanel("website"),
],
heading="Links"
)
]
def _str_(self):
"""String repr of this class."""
return self.name
class Meta: # noqa
verbose_name = "Blog Author"
verbose_name_plural = "Blog Authors"
Как мне сериализовать таким образом, чтобы показать имя автора, веб-сайт, изображение и id?
Я пытался сериализовать BlogAuthor
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = BlogAuthor
fields = (
"id",
"name",
"website",
"image",
)
А вот поле API
APIField("blog_authors", serializer=AuthorSerializer(many=True)),
Когда я запускаю сервер, я получаю эту ошибку
AttributeError at /api/v2/pages/4/
Got AttributeError when attempting to get a value for field `name` on serializer `AuthorSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `BlogAuthorsOrderable` instance.
Original exception text was: 'BlogAuthorsOrderable' object has no attribute 'name'.
Request Method: GET
Request URL: http://127.0.0.1:8000/api/v2/pages/4/?fields=*
Django Version: 4.0.6
Exception Type: AttributeError
Exception Value:
Got AttributeError when attempting to get a value for field `name` on serializer `AuthorSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `BlogAuthorsOrderable` instance.
Original exception text was: 'BlogAuthorsOrderable' object has no attribute 'name'.
Как я могу идеально сериализовать автора моего блога?
Думаю, проблема в том, что между вашим Blog и BlogAuthor есть промежуточная модель - BlogAuthorsOrderable, которая имеет поле sort_order. Я не знаю, как получить именно то, что вы просите, но попробуйте изменить ваш AuthorSerializer следующим образом. Надеюсь, это даст вам достаточно информации, чтобы определить ваши дальнейшие действия.
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = BlogAuthorsOrderable
fields = '__all__'