Rob*_*rto 37 python django json django-rest-framework
我试图返回自定义json get_queryset但总是得到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')
Run Code Online (Sandbox Code Playgroud)
如果我删除所有内容,def我会用标准的json数据得到正确的响应.我做错了什么?
bak*_*kal 59
您也可以使用APIView不需要模型的
class MyOwnView(APIView):
def get(self, request):
return Response({'some': 'data'})
Run Code Online (Sandbox Code Playgroud)
和
urlpatterns = [
url(r'^my-own-view/$', MyOwnView.as_view()),
]
Run Code Online (Sandbox Code Playgroud)
您已将自定义JSON放入get_queryset,这是错误的.如果你想使用a ModelViewSet,这本身就足够了:
class TestViewSet(viewsets.ModelViewSet):
queryset = Test.objects.all()
serializer_class = TestSerializer
Run Code Online (Sandbox Code Playgroud)
这种ModelViewSet带有默认实现.list(),.retrieve(),.create(),.update(),和.destroy().您可以根据需要覆盖(自定义)
.retrieve()和/或 .list()中返回自定义JSONModelViewSet例如,.retrieve()在检索单个对象时覆盖以返回自定义视图.我们可以看一下默认实现,如下所示:
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
以此作为返回自定义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'})
Run Code Online (Sandbox Code Playgroud)
有两种方法可以使用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'})
Run Code Online (Sandbox Code Playgroud)
解决方案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
Run Code Online (Sandbox Code Playgroud)