在之前的代码习惯中,通常使用一个url对应一个视图函数,现在有了restful规范,就要遵循。简单来说,就是多个url对应一个视图,视图中封装了get,post,put,patch,delete等主要方法。相对于FBV来说更加简单,使用了CBV模式。
get,获取数据 post,添加 put,更新 patch 局部更新 delete,删除
INSTALLED_APPS = [ ‘django.contrib.admin‘, ‘django.contrib.auth‘, ‘django.contrib.contenttypes‘, ‘django.contrib.sessions‘, ‘django.contrib.messages‘, ‘django.contrib.staticfiles‘, ‘rest_framework‘ ]
服务端会根据访问者使用工具的不同来区分,如果不添加rest_framework,使用postman等工具访问是没有问题的,但是使用浏览器访问会报错,因为会默认找到rest_framework下的静态html文件进行渲染,此时找不到,因此报错。
路由
from django.conf.urls import url from django.contrib import admin from api import views urlpatterns = [ url(r‘^drf/info/‘, views.DrfInfoView.as_view()), ]
视图
from rest_framework.views import APIView from rest_framework.response import Response class DrfInfoView(APIView): def get(self,request,*args,**kwargs): data = {"":""} return Response(data)
下面前端通过不同方式请求,后端request.body和request.POST得到的数据,本质上是POST根据body得到的数据来做出相应的改变
默认使用x-www-urlencoded方式
request.body: name=alex&age=19&gender=12 request.POST: {‘name‘: [‘alex‘], ‘age‘: [‘19‘], ‘gender‘: [‘12‘]}
json方式
request.body: b‘{"ID":1,"name":"Alex","age":19}‘ request.POST: 没有值
可以看到,通过json发送给后端数据时,request.POST是无法得到数据的,因此,在使用drf时,统一使用request.data
自定义序列化
路由
from django.conf.urls import url from django.contrib import admin from api import views urlpatterns = [ url(r‘^drf/category/$‘, views.DrfCategoryView.as_view()), #get/post通过此url url(r‘^drf/category/(?P<pk>\d+)/$‘, views.DrfCategoryView.as_view()), #put/patch/delete通过此url ]
视图
from api import models from django.forms.models import model_to_dict #序列化,将model转为dict类型 class DrfCategoryView(APIView): def get(self,request,*args,**kwargs): """获取所有文章分类/单个文章分类""" pk = kwargs.get(‘pk‘) if not pk: queryset = models.Category.objects.all().values(‘id‘,‘name‘) data_list = list(queryset) return Response(data_list) else: category_object = models.Category.objects.filter(id=pk).first() data = model_to_dict(category_object) return Response(data) def post(self,request,*args,**kwargs): """增加一条分类信息""" models.Category.objects.create(**request.data) return Response(‘成功‘)
这里使用到了serializers,和modelform使用方法相似。如果要序列化(将model转为json对象)就使用instance=queryset,反之,data参数写为data=request.data
路由
from django.conf.urls import url from django.contrib import admin from api import views urlpatterns = [ url(r‘^new/category/$‘, views.NewCategoryView.as_view()), url(r‘^new/category/(?P<pk>\d+)/$‘, views.NewCategoryView.as_view()), ]
视图
class NewCategoryView(APIView): def get(self,request,*args,**kwargs): pk = kwargs.get(‘pk‘) if not pk: queryset = models.Category.objects.all() ser = NewCategorySerializer(instance=queryset,many=True) #many=True显示多条数据 return Response(ser.data) else: model_object = models.Category.objects.filter(id=pk) ser = NewCategorySerializer(instance=model_object, many=False) #many=False显示单条数据 return Response(ser.data) def post(self,request,*args,**kwargs): ser = NewCategorySerializer(data=request.data) if ser.is_valid(): ser.save() return Response(ser.data) return Response(ser.errors) def put(self,request,*args,**kwargs): pk = kwargs.get(‘pk‘) category_object = models.Category.objects.filter(id=pk).first() ser = NewCategorySerializer(instance=category_object,data=request.data) if ser.is_valid(): ser.save() return Response(ser.data) return Response(ser.errors) def delete(self,request,*args,**kwargs): pk = kwargs.get(‘pk‘) models.Category.objects.filter(id=pk).delete() return Response(‘删除成功‘)
要跨表查看其他表中的字段,或者
原文:https://www.cnblogs.com/gaoyukun/p/11801822.html