APIView (一级类视图)
1.创建模型类
class Dept(models.Model):
name = models.CharField(max_length=30)
t_number = models.IntegerField()
def __str__(self):
return self.name
class Meta:
db_table='dept'
python manage.py makemigrations
python manage.py migrate
2.写序列化器
from rest_framework import serializers
from .models import Dept
class DeptSer(serializers.ModelSerializer):
class Meta:
model=Dept
fields='__all__'
3.写接口
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Dept
from .serilizers import DeptSer
class DeptList(APIView):
def get(self,request):
deptlist = Dept.objects.all()
dept = DeptSer(deptlist,many=True)
return Response(dept.data)
def post(self,request):
ser = DeptSer(data=request.data)
if ser.is_valid():
ser.save()
else:
print(ser.errors)
return Response('ok')
4.配制路由
from meiduo import views
urlpatterns = [
path('deptlist/', views.DeptList.as_view()),
]
5.创建vue页面
<template>
<div>
<table>
<tr>
<td>名称</td>
<td>人数</td>
</tr>
<tr v-for='i in deptlist'>
<td>{{i.name}}</td>
<td>{{i.t_number}}</td>
</tr>
</table>
</div>
</template>
<script>
export default{
data:function(){
return{
deptlist:[]
}
},
mounted() {
this.getlist()
},
methods: {
getlist:function(){
this.axios.get('/api/deptlist/').then(res=>{
this.deptlist = res.data
})
}
},
}
</script>
GenericAPIView (二级类视图)
from rest_framework.generics import GenericAPIView
继承自APIVIew ,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。
使用GenericAPIView类一般需要实现queryset属性或者重写get_queryset方法
支持定义的属性:
- 列表视图与详情视图通用:
- queryset列表视图的查询集
- serializer_class视图使用的序列化器
- 列表视图使用:
- pagination_class分页控制类
- filter_backends过滤控制后端
- 详情页视图使用:
- lookup_field查询单一数据库对象时使用的条件字段,默认为’
pk ’ - lookup_url_kwarg查询单一数据时URL中的参数关键字名称,默认与look_field相同
提供的方法:
-
列表视图与详情视图通用:
-
get_queryset(self) 返回视图使用的查询集,是列表视图与详情视图获取数据的基础,默认返回queryset 属性,可以重写,例如: def get_queryset(self):
user = self.request.user
return user.accounts.all()
-
get_serializer_class(self) 返回序列化器类,默认返回serializer_class ,可以重写,例如: def get_serializer_class(self):
if self.request.user.is_staff:
return FullAccountSerializer
return BasicAccountSerializer
-
get_serializer(self,_args, *_kwargs) 返回序列化器对象,被其他视图或扩展类使用,如果我们在视图中想要获取序列化器对象,可以直接调用此方法。 注意,在提供序列化器对象的时候,REST framework会向对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。 -
详情视图使用:
例1:查询所有
from rest_framework.generics import GenericAPIView
class DeptGenManage(GenericAPIView):
queryset = Dept.objects.all()
serializer_class = DeptSer
def get(self,request):
dept = self.get_queryset()
ser = self.get_serializer(dept,many=True)
return Response(ser.data)
例2:按id查询
path('detail/<int:id>',views.DeptGenManage.as_view())
re_path(r'detail/(?P<id>\d)',views.DeptGen.as_view())
class DeptGenManage(GenericAPIView):
queryset = Dept.objects.all()
serializer_class = DeptSer
lookup_field = 'id'
def get(self,request,id):
dept = self.get_object()
ser = self.get_serializer(dept)
return Response(ser.data)
Mixin类视图
使用基于类的视图的最大好处之一是它使我们能够轻松地组合可重用的行为。
GenericAPIView* 只是提供了数据,对应的访问功能是没有实现的,所以 DRF 还有五个提供方法的混入类,可以完成基本增删改查功能,我们也叫 Mixin 混入类,通过 GenericAPIView* 与混入类的多继承**,可以实现更加复杂的接口功能,GenericAPIView* 提供数据*,而混入类提供操作
1)ListModelMixin 直接用List添加数据 展示数据 获取数据
列表视图扩展类,提供list(request, *args, **kwargs) 方法快速实现列表视图,返回200状态码。
该Mixin的list方法会对数据进行过滤和分页。
举例:
from rest_framework.mixins import ListModelMixin
from rest_framework.generics import GenericAPIView
class ListModelView(ListModelMixin,GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
def get(self,request):
return self.list(request)
2)CreateModelMixin 添加数据
创建视图扩展类,提供create(request, *args, **kwargs) 方法快速实现创建资源的视图,成功返回201状态码。
如果序列化器对前端发送的数据验证失败,返回400错误。
举例:
from rest_framework.mixins import CreateModelMixin
class ListModelView(CreateModelMixin,GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
def post(self,request):
return self.create(request)
3) RetrieveModelMixin 查询单个数据
详情视图扩展类,提供retrieve(request, *args, **kwargs) 方法,可以快速实现返回一个存在的数据对象。
如果存在,返回200, 否则返回404。
例如:
from rest_framework.mixins import RetrieveModelMixin
class ListModelView(RetrieveModelMixin,GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
def get(self,request,pk):
return self.retrieve(request)
4)UpdateModelMixin 修改数据
更新视图扩展类,提供update(request, *args, **kwargs) 方法,可以快速实现更新一个存在的数据对象。
同时也提供partial_update(request, *args, **kwargs) 方法,可以实现局部更新。
成功返回200,序列化器校验数据失败时,返回400错误。
举例:
from rest_framework.mixins import UpdateModelMixin
class ListModelView(UpdateModelMixin,GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
def put(self,request,pk):
return self.update(request)
5)DestroyModelMixin 删除数据
删除视图扩展类,提供destroy(request, *args, **kwargs) 方法,可以快速实现删除一个存在的数据对象。
成功返回204,不存在返回404。
举例:
from rest_framework.mixins import DestroyModelMixin
class ListModelView(DestroyModelMixin,GenericAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
def delete(self,request,pk):
return self.destroy(request)
综合案例
from rest_framework.mixins import ListModelMixin,CreateModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
class DeptMixinMange(GenericAPIView,ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin):
queryset = Dept.objects.all()
serializer_class = DeptSer
lookup_field='id'
def get(self,request):
return self.list(request)
def post(self,request):
return self.create(request)
def put(self,request,id):
return self.update(request)
def delete(self,request,id):
return self.destroy(request)
通用类视图 generics
通过使用mixin 类,我们重写了视图,使其使用的代码比以前稍微少一些,但我们还可以更进一步。REST框架提供了一组已经混合在一起的通用视图,我们可以使用它们来进一步精简views.py 模块。
class GenericList(generics.ListCreateAPIView):
queryset = Dept.objects.all()
serializer_class = DeptSer
子类视图(三级类视图) ****
1) CreateAPIView ***
提供 post 方法
继承自: GenericAPIView、CreateModelMixin
class TeacherCreateView(CreateAPIView):
serializer_class = TeacherCreateSer
2)ListAPIView ***
提供 get 方法
继承自:GenericAPIView、ListModelMixin
class TeacherListView(ListAPIView):
queryset = Teacher.objects.all()
serializer_class = TeacherListSer
3)RetireveAPIView ***
提供 get 方法
继承自: GenericAPIView、RetrieveModelMixin
class GenericList(RetrieveAPIView):
queryset = Dept.objects.all()
serializer_class = DeptSer
lookup_field='id'
4)DestroyAPIView ****
提供 delete 方法
继承自:GenericAPIView、DestoryModelMixin
class GenericList(DestroyAPIView):
queryset = Dept.objects.all()
serializer_class = DeptSer
lookup_field='id'
5)UpdateAPIView ***
提供 put 和 patch 方法
继承自:GenericAPIView、UpdateModelMixin
class TeacherUpdateView(UpdateAPIView):
lookup_field = 'pk'
queryset = Teacher.objects.all()
serializer_class = TeacherUpdateSer
6)RetrieveUpdateAPIView *********
提供 get、put、patch方法
继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin
7)RetrieveUpdateDestoryAPIView
提供 get、put、patch、delete方法
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin
|