Сериализатор сниппетов 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__'
Вернуться на верх