Zekiyev
Zekiyev

Reputation: 1

How to customize PagesAPIViewsets that it can retrieve data in "http://127.0.0.1:8000/api/v2/pages/?slug=home-page&locale=en" endpoint in wagtail?

By default wagtail.api.v2 retrieves data by id. but i want to modify that it can retrieve data by slug+locale parameters

so, i decided to create endpoint "api/v2/pages/?slug=slug"

but when i am sending request into this endpoint, it returns me a single filter response page such as below

{ "meta": { "total_count": 1 }, "items": [ { "id": 34, "meta": { "type": "blog.BlogPage", "detail_url": "http://apimabas.demodev.click/api/v2/pages/34/", "html_url": "http://apimabas.demodev.click/en/blogs/test/", "slug": "test", "first_published_at": "2023-03-31T06:11:02.402366Z", "locale": "en" }, "title": "Comparison" } ] }

my serializer and view had been given below

type hereclass CustomPageSerializer(PageSerializer):
    def get_fields(self):
        fields = super().get_fields()
        fields['detail_url'] = serializers.SerializerMethodField()
        return fields
    
    def get_detail_url(self, obj):
    
        return self.context['request'].build_absolute_uri(obj.slug + '/')


class CustomPageViewSet(PagesAPIViewSet):
    lookup_field = 'slug'
    model = Page
    base_serializer_class = CustomPageSerializer

    def get_object(self):
        # Retrieve the object using the custom slug field

        slug = self.kwargs[self.lookup_field]
        try:
            obj = Page.objects.filter(slug=slug).first()
        except Page.DoesNotExist:
            raise NotFound

        # Return the object
        return obj.specific
    

    def detail_view(self, request):
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

    @classmethod
    def get_urlpatterns(cls):
        """
        This returns a list of URL patterns for the endpoint
        """
        return [
            path("", cls.as_view({"get": "listing_view"}), name="listing"),
            path("<slug:slug>/", cls.as_view({"get": "detail_view"}), name="detail"),
            path("find/", cls.as_view({"get": "find_view"}), name="find"),
        ]

Upvotes: 0

Views: 58

Answers (0)

Related Questions