目录
一、实现数据库的增删改查 - 未优化常规写法(两个路由两个视图)
二、优化方式一 - GenericAPIView, ListModelMixin, CreateModelMixin……
2-3-2 ListModelMixin - 用于get获取数据列表
2-3-4 RetrieveModelMixin - 获取单个对象
2-3-5 UpdateModelMixin - 更新单个对象
2-3-6 DestroyModelMixin - 删除对象
三、方式二- ListCreateAPIView、RetrieveUpdateDestroyAPIView
3-2-2 RetrieveUpdateDestroyAPIView
四、方式三 - ModelViewSet 配合 urls路由(不推荐)
一、实现数据库的增删改查 - 未优化常规写法(两个路由两个视图)
1-1 两条路由分发 - 接参不接参
from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)', views.PublishDetailView.as_view()), ]
1-2 Serializers用于获取数据序列化
from rest_framework import serializers from app01 import models class PublishSerializers(serializers.ModelSerializer): class Meta: model = models.Publish fields = '__all__'
1-3 视图函数
from django.shortcuts import render, HttpResponse from rest_framework.views import APIView from django.http import JsonResponse from app01 import MySerializer class PublishView(APIView): def get(self, request): publish_list = models.Publish.objects.all() ser = MySerializer.PublishSerializers(publish_list, many=True) return JsonResponse(ser.data, safe=False) def post(self, request): ser = MySerializer.PublishSerializers(data=request.data) if ser.is_valid(): ser.save() return JsonResponse(ser.data, safe=False) else: return JsonResponse(ser.errors, safe=False) class PublishDetailView(APIView): def get(self, request, pk): publish_obj = models.Publish.objects.filter(pk=pk).first() ser = MySerializer.PublishSerializers(publish_obj, many=False) return JsonResponse(ser.data, safe=False) def put(self, request, pk): publish_obj = models.Publish.objects.filter(pk=pk).first() ser = MySerializer.PublishSerializers(data=request.data, instance=publish_obj) if ser.is_valid(): ser.save() return JsonResponse(ser.data, safe=False) else: return JsonResponse(ser.errors, safe=False) def delete(self, request, pk): models.Publish.objects.filter(pk=pk).delete() return JsonResponse("delete", safe=False)
二、优化方式一 - GenericAPIView, ListModelMixin, CreateModelMixin……
总结:
- ListModelMixin - 获取对象列表
- CreateModelMixin - 创建对象数据
- RetrieveModelMixin - 获取指定对象数据
- UpdateModelMixin - 更新对象数据
- DestroyModelMixin - 删除对象数据
2-1 视图函数 + 路由设计
''' from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)', views.PublishDetailView.as_view()), ] ''' from app01 import models from app01 import MySerializer from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, \ DestroyModelMixin from rest_framework.generics import GenericAPIView class PublishView(GenericAPIView, ListModelMixin, CreateModelMixin): queryset = models.Publish.objects.all() serializer_class = MySerializer.PublishSerializers def get(self, request): return self.list(request) def post(self, request): return self.create(request) class PublishDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin): queryset = models.Publish.objects.all() serializer_class = MySerializer.PublishSerializers def get(self, request, pk): return self.retrieve(request, pk) def put(self, request, pk): return self.update(request, pk) def delete(self, request, pk): return self.destroy(request, pk)
2-2 视图优化思路 - 单独提出重复代码,封装成类及方法
''' from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)', views.PublishDetailView.as_view()), ] ''' ''' 数据库的增删改查逻辑,提出来封装成类,以及类内的方法 ''' class List: def list(self, request): # queryset : Publish.objects.all(),serializers : PublishSerializers queryset = self.queryset.all() ser = self.serializers(queryset, many=True) return JsonResponse(ser.data, safe=False) class Create: def create(self, request): print(request.data