Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to return custom JSON in Django REST Framework

I am trying to return custom json with get_queryset but always get 404 error in response.

class TestViewSet(viewsets.ModelViewSet):     """     API endpoint that allows groups to be viewed or edited.     """     queryset = Test.objects.all()     serializer_class = TestSerializer      def get_queryset(self):         if self.request.method == "GET":             content = {'user_count': '2'}             return HttpResponse(json.dumps(content), content_type='application/json') 

If I delete everything starting from def I'll got correct response with standard json data. What I am doing wrong?

like image 412
Roberto Avatar asked Jan 26 '16 16:01

Roberto


1 Answers

If you don't need a ModelViewSet and just want custom JSON on a GET request

You can also use an APIView, which doesn't require a model

class MyOwnView(APIView):     def get(self, request):         return Response({'some': 'data'}) 

and

urlpatterns = [     url(r'^my-own-view/$', MyOwnView.as_view()), ] 

With a ModelViewSet

You've put the custom JSON into get_queryset, that's wrong. If you want to use a ModelViewSet, this by itself should be enough:

class TestViewSet(viewsets.ModelViewSet):     queryset = Test.objects.all()     serializer_class = TestSerializer 

This ModelViewSet comes with default implementations for .list(), .retrieve(), .create(), .update(), and .destroy(). Which are available for you to override (customize) as needed

Returning custom JSON from .retrieve() and/or .list() in ModelViewSet

E.g. to override .retrieve() to return custom view when retrieving a single object. We can have a look at the default implementation which looks like this:

def retrieve(self, request, *args, **kwargs):     instance = self.get_object()     serializer = self.get_serializer(instance)     return Response(serializer.data) 

So as an example to return custom JSON:

class TestViewSet(viewsets.ModelViewSet):     queryset = Test.objects.all()     serializer_class = TestSerializer      def retrieve(self, request, *args, **kwargs):         return Response({'something': 'my custom JSON'})      def list(self, request, *args, **kwargs):         return Response({'something': 'my custom JSON'}) 
like image 113
bakkal Avatar answered Sep 26 '22 19:09

bakkal