LazerFriends
LazerFriends

Reputation: 421

Wagtail: Creating a custom API endpoint

I've created a Snippet called "Spotlights," and I'm wondering how I can create a custom endpoint for Snippet data with the Wagtail API. My best guess would be:

api_router.register_endpoint('Spotlights', BaseAPIEndpoint)

Is the first arg there establishing the name of the endpoint, or referencing something?

Upvotes: 4

Views: 3617

Answers (4)

banDeveloper
banDeveloper

Reputation: 38

I needed to modify glls's solution a bit to make it work. To expose the endpoint in api.py:

from .views import CustomViewSet

api_router.register_endpoint("custom", CustomViewSet)

It's also common to add filtering functionality. In views.py:

from wagtail.images.api.v2.views import BaseAPIViewSet, FieldsFilter

from .models import Custom

class CustomViewSet(BaseAPIViewSet):
    model = Custom
    body_fields = BaseAPIViewSet.body_fields + [
        "name"
    ]
    filter_backends = [
        FieldsFilter
    ]

You can now filter the Custom snippet like normal: /api/v2/custom/?name=something

Upvotes: 1

glls
glls

Reputation: 2403

Latest Wagtail version - 2.15 +

in your views file, import your model and BaseApiViewSet

from .models import CustomModel
from wagtail.api.v2.views import BaseAPIViewSet

class BusinessLocationViewSet(BaseAPIViewSet):

    model = BusinessLocation
    body_fields = BaseAPIViewSet.body_fields + ['id', 'field1', 'field2', 'field3', 'field4', etc, etc...]

and in the api.py file in the project folder, import your model and expose it to the api as follows:

from custommodel.views import MyModel

api_router.register_endpoint('custom', MyModel)

and now your model will be accessible from the api/v2/custom endpoint

Upvotes: 1

LazerFriends
LazerFriends

Reputation: 421

I've figured it out: just subclass Wagtail's BaseAPIEndpoint. For example:

endpoints.py

from wagtail.api.v2.endpoints import BaseAPIEndpoint

class SpotlightsAPIEndpoint(BaseAPIEndpoint):
    ...
    model = Spotlight

api.py

from .endpoints import SpotlightsAPIEndpoint

api_router.register_endpoint('spotlights', SpotlightsAPIEndpoint)

Plus there are tons of ways to customize it. Just take a look at the endpoints.py file in the Wagtail repo: https://github.com/wagtail/wagtail/blob/master/wagtail/api/v2/endpoints.py

Upvotes: 8

Aipi
Aipi

Reputation: 2456

According to Wagtail documentation, the first parameter is the name of the endpoint (eg. pages, images) and this is used in the URL of the endpoint. The second parameter is the endpoint class that handles the requests.

For example:

api_router.register_endpoint('pages', PagesAPIEndpoint)
api_router.register_endpoint('images', ImagesAPIEndpoint)
api_router.register_endpoint('documents', DocumentsAPIEndpoint)

So, I advise you to make like:

api_router.register_endpoint('spotlights', BaseAPIEndpoint)

Upvotes: 1

Related Questions