一,不是用组件内容,写五种方式
视图层:
from rest_framework.views import View, APIView from app01.models import * from app01.mySer import * from django.http import JsonResponse class PublishView(APIView): def get(self, request): publish_list = Publish.objects.all() bs = PublishSerializers(publish_list, many=True) print(bs.data) return JsonResponse(bs.data, safe=False) def post(self, request): print(request.data) bs = PublishSerializers(data=request.data) if bs.is_valid(): bs.save() return JsonResponse(bs.data, safe=False) else: return JsonResponse(bs.errors, safe=False) class PublishDetailView(APIView): def get(self, request, pk): publish_obj = Publish.objects.filter(pk=pk).first() bs = PublishSerializers(publish_obj, many=False) return JsonResponse(bs.data, safe=False) def post(self, request, pk): publish_obj = Publish.objects.filter(pk=pk).first() bs = PublishSerializers(data=request.data, instance=publish_obj) if bs.is_valid(): bs.save() return JsonResponse(bs.data) else: return JsonResponse(bs.errors) def delete(self, request, pk): Publish.objects.filter(pk=pk).delete() return JsonResponse('')
路由配置
url(r'publish/$', views.PublishView.as_view()), url(r'publish/(?P<pk>\d+)', views.PublishDetailView.as_view()),
序列化组件:
from rest_framework import serializers from app01.models import * class AuthorSerializer(serializers.ModelSerializer): nid = serializers.CharField() name = serializers.CharField() age = serializers.CharField() class BookSerializer(serializers.ModelSerializer): class Meta: model = Book # fields = ['nid', 'name'] fields = '__all__' class PublishSerializers(serializers.ModelSerializer): class Meta: model = Publish fields = '__all__'
二,第一种方式(只把创建和查询的方式封装成两个类)
from rest_framework.views import View, APIView from app01.models import * from app01.mySer import * from django.http import JsonResponse class List: def list(self, request): queryset = self.queryset.all() print(queryset) bs = self.serializers(queryset, many=True) print(bs.data) return JsonResponse(bs.data, safe=False) class Create: def create(self, request): print(request.data) bs = self.serializers(data=request.data) if bs.is_valid(): bs.save() return JsonResponse(bs.data, safe=False) else: return JsonResponse(bs.errors, safe=False) class PublishView(APIView, List, Create): queryset = Publish.objects serializers = PublishSerializers def get(self, request): return self.list(request) def post(self, request): return self.create(request) class BookView(APIView, List, Create): queryset = Book.objects.all() serializers = BookSerializer def get(self, request): return self.list(request) def post(self, request): return self.create(request)
第二种方式(drf提供的封装类接口)
from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, \ DestroyModelMixin from rest_framework.generics import GenericAPIView class PublishView(GenericAPIView, ListModelMixin, CreateModelMixin): # django内部设置的两个变量接口,直接调用赋值即可 queryset = Publish.objects.all() serializer_class = PublishSerializers def get(self, request): return self.list(request) # 添加数据 def post(self, request): return self.create(request) class PublishDetailView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin): queryset = Publish.objects.all() serializer_class = 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) class BookView(GenericAPIView, ListModelMixin, CreateModelMixin): queryset = Book.objects.all() serializer_class = BookSerializer def get(self, request): return self.list(request) def post(self, request): return self.create(request)
第三种方式(请求的方式已经封装好,直接继承父类即可,但是此时两种方式是分开的)
from app01.mySer import * from rest_framework.mixins import ListModelMixin, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin, \ DestroyModelMixin from rest_framework.generics import GenericAPIView from rest_framework.generics import ListCreateAPIView, ListAPIView, RetrieveUpdateDestroyAPIView class PublishView(GenericAPIView, ListModelMixin, CreateModelMixin): class PublishView(ListCreateAPIView): queryset = Publish.objects.all() serializer_class = PublishSerializers class PublishDetailView(RetrieveUpdateDestroyAPIView): queryset = Publish.objects.all() serializer_class = PublishSerializers
第四种方式(直接协程一个类,在路由内进行方法的匹配)强烈不建议使用
from rest_framework.views import APIView from rest_framework.viewsets import ModelViewSet from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer class PublishView(ModelViewSet): # 编码格式的更改 # renderer_classes = [JSONRenderer,BrowsableAPIRenderer] queryset = Publish.objects.all() serializer_class = PublishSerializers
这是需要路由的匹配才能完成
url(r'publish', views.PublishView.as_view({'get': 'list', 'post': 'create'})), url(r'publish/(?P<pk>\d+)', views.PublishView.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
三,路由的配置(三种)
一种基本路由:url(r'^publish/$', views.PublishView.as_view()),
二,半自动路径(在类中必须继承ViewSetMixin,并且写在APIView前面):views.PublishView.as_view({'get': 'list', 'post': 'create'}))
三,全自动路由
路由配置的时候要写空,如果添加数据也是可以的,但是生成的路由都拼接在它后面
from rest_framework import routers # 生成一个router对象 router=routers.DefaultRouter() # 需要传两个参数,第一个参数就是匹配的路径,第二个参数,是视图类 router.register('publish',views.PublishView) url('', include(router.urls)), #自动生成四个路由(PublishView必须继承ModelViewSet)
四,响应器
视图类中:
from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer renderer_classes=[JSONRenderer,BrowsableAPIRenderer]
在全局配置中:
REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer'] }
- 内置渲染器
显示json格式:JSONRenderer 访问URL: http://127.0.0.1:8000/test/?format=json http://127.0.0.1:8000/test.json http://127.0.0.1:8000/test/ 默认显示格式:BrowsableAPIRenderer(可以修改它的html文件) 访问URL: http://127.0.0.1:8000/test/?format=api http://127.0.0.1:8000/test.api http://127.0.0.1:8000/test/ 表格方式:AdminRenderer 访问URL: http://127.0.0.1:8000/test/?format=admin http://127.0.0.1:8000/test.admin http://127.0.0.1:8000/test/ form表单方式:HTMLFormRenderer 访问URL: http://127.0.0.1:8000/test/?format=form http://127.0.0.1:8000/test.form http://127.0.0.1:8000/test/
- 局部作用
renderer_classes = [HTMLFormRenderer,BrowsableAPIRenderer ]
- 全局使用
REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer'] }
- 自定义显示模板
from rest_framework.renderers import TemplateHTMLRenderer class BookDetailView(APIView): renderer_classes = [TemplateHTMLRenderer] def get(self,request,pk): book_obj=models.Book.objects.filter(pk=pk).first() bs=BookSerializers(book_obj,many=False) return Response(bs.data,template_name='aa.html')
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{ title }} {{ publishDate }} </body> </html>