[英]How to return custom JSON in Django REST Framework
我正在嘗試使用get_queryset
返回自定義json,但始終會收到404 error
。
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')
如果刪除從def
開始的所有內容,我將獲得標准json數據的正確響應。 我做錯了什么?
您還可以使用不需要模型的APIView
class MyOwnView(APIView):
def get(self, request):
return Response({'some': 'data'})
和
urlpatterns = [
url(r'^my-own-view/$', MyOwnView.as_view()),
]
您已將自定義JSON放入get_queryset中,這是錯誤的。 如果要使用ModelViewSet
, ModelViewSet
就足夠了:
class TestViewSet(viewsets.ModelViewSet):
queryset = Test.objects.all()
serializer_class = TestSerializer
此ModelViewSet
帶有.list()
.retrieve()
.create()
.update()
和.destroy()
默認實現。 哪些可供您根據需要覆蓋(自定義)
.retrieve()
和/或.list()
中ModelViewSet
例如,重寫.retrieve()
以在檢索單個對象時返回自定義視圖。 我們可以看一下默認實現,如下所示 :
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
因此,以返回自定義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'})
有兩種方法可以使用ModelViewSet在基於類的視圖中自定義響應
解決方案1:在views.py中自定義
class StoryViewSet(viewsets.ModelViewSet):
permission_classes = (permissions.AllowAny,)
queryset = Story.objects.all()
serializer_class = StorySerializer
def retrieve(self, request, *args, **kwargs):
# ret = super(StoryViewSet, self).retrieve(request)
return Response({'key': 'single value'})
def list(self, request, *args, **kwargs):
# ret = super(StoryViewSet, self).list(request)
return Response({'key': 'list value'})
解決方案2:在serializers.py中自定義(我推薦此解決方案)
class StorySerializer(serializers.ModelSerializer):
class Meta:
model = Story
fields = "__all__"
def to_representation(self, instance):
ret = super(StorySerializer, self).to_representation(instance)
# check the request is list view or detail view
is_list_view = isinstance(self.instance, list)
extra_ret = {'key': 'list value'} if is_list_view else {'key': 'single value'}
ret.update(extra_ret)
return ret
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.