Wagtail API - 如何公开片段

mno*_*tka 3 python django django-rest-framework wagtail

想象一下,我有一个Snippet和一个Page包含它:

@register_snippet
class MySnippet(models.Model):
    content = models.CharField(max_length=255)


class MyPage(Page):
    snippet = models.ForeignKey('MySnippet', null=True, blank=True, on_delete=models.SET_NULL, related_name='+')

    api_fields = [
        APIFiled('snippet')
    ]
Run Code Online (Sandbox Code Playgroud)

现在在 wagtail API 页面端点中,此页面将如下所示:

{
    "id": 1,
    "meta": { ... },
    "snippet": {
        "id": 1,
        "meta": {
            "type": "my_module.MySnippet"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能使此端点显示代码段的内容?

另外,如何仅为片段创建单独的 API 端点?

Laz*_*nds 5

我不确定如何回答主要问题,但我可以帮助为片段创建单独的 API 端点。

您必须在应用程序根目录中创建一个 endpoints.py 文件,使用现有的 Wagtail 端点类作为基础,例如 BaseAPIEndpoint

然后,在 api.py 文件中注册新端点。

端点.py

from wagtail.api.v2.endpoints import BaseAPIEndpoint
from .models import MySnippetModel

class MySnippetModelAPIEndpoint(BaseAPIEndpoint):

    model = MySnippetModel

    body_fields = BaseAPIEndpoint.body_fields + [
        'field_1',
        'field_2',
        'field_3',
    ]

    listing_default_fields = BaseAPIEndpoint.listing_default_fields = [
        'field_1',
        'field_2',
        'field_3',
    ]
Run Code Online (Sandbox Code Playgroud)

api.py

from .endpoints import MySnippetModelAPIEndpoint

...

sua_api_router.register_endpoint('snippets', MySnippetModelAPIEndpoint)
Run Code Online (Sandbox Code Playgroud)

我还会查看 Wagtail 核心中的 endpoints.py 文件,以便您可以查看还可以扩展或修改的内容。

https://github.com/wagtail/wagtail/blob/master/wagtail/api/v2/endpoints.py


Udi*_*wal 5

这就是我的做法,尽管就我而言,这是一个足够简单的表示

from rest_framework import serializers

class MyPage(Page):
    snippet = models.ForeignKey('MySnippet', null=True, blank=True, on_delete=models.SET_NULL, related_name='+')

    api_fields = [
        APIField('snippet', serializer=serializers.StringRelatedField(many=True))
    ]
Run Code Online (Sandbox Code Playgroud)

您可以将“ str ”方法添加到您的代码片段中

@register_snippet
class MySnippet(models.Model):
    content = models.CharField(max_length=255)

        def __str__(self):
            return self.content
Run Code Online (Sandbox Code Playgroud)