Django REST framework 编写基于类的视图!!!
上一章介绍了基于装饰器的视图函数,本章我们将介绍基于APIView类的方法,实现基于类的视图
上一章地址:https://blog.csdn.net/qq_41590764/article/details/108819233
基于类的视图有哪些优势:
开始
第一步:新建项目,app,安装,创建model...
前期准备工作就不做过多介绍了,可以参考前面的内容!!!
app名称是demo1
第二步:编写views.py
新建一个UserViewSet类,继承APIView,实现get,post请求!
class UserViewSet(APIView):
def get(self, request):
users = User.objects.all()
user = UserSer(users, many=True)
return Response(data=user.data)
def post(self, request):
user = UserSer(data=request.data)
if user.is_valid():
user.save()
return Response(data=user.data, status=status.HTTP_200_OK)
else:
return Response(data=user.errors, status=status.HTTP_400_BAD_REQUEST)
新建第二个类,实现get单个数据,修改,删除数据,即put,delete请求!
class UserViewSetPutDelete(APIView):
'''
重写get_object方法,以定位具体某一个数据
'''
def get_object(self, pk):
try:
return User.objects.get(User_id=pk)
except:
# 注意这里是 raise,不是return,raise的用法,百度。。。
raise Http404
def get(self, request, pk):
user = self.get_object(pk)
u = UserSer(user)
return Response(data=u.data, status=status.HTTP_200_OK)
def put(self, request, pk):
user = self.get_object(pk)
u = UserSer(user, data=request.data)
if u.is_valid():
u.save()
return Response(data=u.data, status=status.HTTP_200_OK)
else:
return Response(data=u.errors, status=status.HTTP_404_NOT_FOUND)
def delete(self, request, pk):
user = self.get_object(pk)
user.delete()
return Response(status=status.HTTP_200_OK)
第三步:使用mixins改写
使用基于类视图的最大优势之一是它可以轻松地创建可复用的行为。下面使用mixins混合改写代码
class UserViewSet(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):
queryset = User.objects.all()
serializer_class = UserSer
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
DRF框架中mixins已经写好了很多方法,仅需调用即可,下面定义put,delete请求!
class UserViewSetPutDelete(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
generics.GenericAPIView):
queryset = User.objects.all()
serializer_class = UserSer
def 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)
第四步:进一步缩减代码量
后来我们发现,这样写代码也存在很多复用的情况,但generics中已经封装好了一项基础功能的代码,直接调用即可
class UserViewSet(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSer
class UserViewSetPutDelete(generics.RetrieveUpdateDestroyAPIView):
queryset = User.objects.all()
serializer_class = UserSer
至此仅需6行,就实现了get,post,put,delete请求
回到最初,我们只用了三行代码即实现了增删改查,但urls.py有稍微不同!
第五步:配置url
三行代码实现的url配置,可参考第一章,地址:https://blog.csdn.net/qq_41590764/article/details/108810761
第六步:启动项目
输入ip地址:http://127.0.0.1:8000/api/
输入ip地址:http://127.0.0.1:8000/api/1/