Reputation: 1
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