网站以前在百度能搜索不到了,做的网站 v2ex,科协网站建设的建议,什么事网站开发传统Django中有基于类的视图#xff0c;Drf中自然也有#xff0c;目的都是实现功能的模块化继承#xff0c;封装#xff0c;减少重复代码。
首先在视图中新增下面代码#xff1a;
# simpletool/views.pyfrom rest_framework.views import APIView
from simpletool.seria…传统Django中有基于类的视图Drf中自然也有目的都是实现功能的模块化继承封装减少重复代码。
首先在视图中新增下面代码
# simpletool/views.pyfrom rest_framework.views import APIView
from simpletool.serializers import ToolDetailSerializer
from django.http import Http404class simpletoolDetail(APIView):def get_object(self,pk):try:return simpleTool.objects.get(pkpk)except:raise Http404def get(self,request,pk):simpletool self.get_object(pk)serializer ToolDetailSerializer(simpletool)return Response(serializer.data)def put(self,request,pk):simpletool self.get_object(pk)serializer ToolDetailSerializer(simpletool,datarequest.data)# 验证提交的数据是否合法不合法则返回400if serializer.is_valid():# 序列化器将持有数据反序列化后保存到数据库中serializer.save()return Response(serializer.data)return Response(serializer.errors,statusstatus.HTTP_400_BAD_REQUEST)def delete(self,request,pk):simpletool self.get_object(pk)simpletool.delete()return Response(statusstatus.HTTP_204_NO_CONTENT)
上述代码为对tool的获取修改删除的3个方法以及获取单个tool信息的方法其中get(),put()就是有一部将对象序列化或者反序列化的步骤。
# 序列化这个概念与具体语言无关python或者javascript对象转化为json都称为序列化反正为反序列化。
现在来补充ToolDetailSerializer。与simpleTool列表不同需要返回该工具所有完整的数据信息所以需要给它新定义一个序列化器
#simpletool/serializers.py
class ToolDetailSerializer(serializers.ModelSerializer):class Meta:model simpleToolfields __all__
配置urls.py
#simpletool/urls.py
urlpatterns [path(,views.tool_list,namelist),path(int:pk/,views.simpletoolDetail.as_view(),namedetail),
]
httpie 测试
http http://127.0.0.1:8000/api/simpletool/1/ 尝试修改工具名 http PUT http://127.0.0.1:8000/api/simpletool/1/ titletest_tool 可以尝试将它删掉
http DELETE http://127.0.0.1:8000/api/simpletool/1/
1. 通用视图
实际上增删改查为通用操作所以可以用DRF提供的Mixin类直接集成对应的功能
修改simpletoolDetail
#simpletool/views.pyfrom rest_framework import mixins
from rest_framework import genericsclass simpletoolDetail(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,generics.GenericAPIView):queryset simpleTool.objects.all()serializer_class ToolDetailSerializerdef get(self, request, *args, **kwargs):return self.retrieve(request, *args, **kwargs)def put(self, request, *args, **kwargs):return self.update(request, *args, **kwargs)def delete(self, request, *args, **kwargs):return self.destroy(request, *args, **kwargs)
我们可以让它更简单
#simpletool/views.pyclass simpletoolList(generics.ListCreateAPIView):queryset simpleTool.objects.all()serializer_class ToolListSerializerclass simpletoolDetail(generics.RetrieveUpdateDestroyAPIView):queryset simpleTool.objects.all()serializer_class ToolDetailSerializer
修改urls.py
#simpletool/urls.py
urlpatterns [path(,views.simpletoolList.as_view(),namelist),path(int:pk/,views.simpletoolDetail.as_view(),namedetail),
]