#部门表
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
from rest_framework import serializers
from .models import Dept
#部门序列化器
class DeptSer(serializers.ModelSerializer):
class Meta:
model=Dept
fields='__all__'
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
# Create your views here.
#获取所有部门信息
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')
from meiduo import views
urlpatterns = [
path('deptlist/', views.DeptList.as_view()),
]
名称
人数
{{i.name}}
{{i.t_number}}
from rest_framework.generics import GenericAPIView
继承自APIVIew
,增加了对于列表视图和详情视图可能用到的通用支持方法。通常使用时,可搭配一个或多个Mixin扩展类。
使用GenericAPIView类一般需要实现queryset属性或者重写get_queryset方法
pk
’列表视图与详情视图通用:
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
返回序列化器对象,被其他视图或扩展类使用,如果我们在视图中想要获取序列化器对象,可以直接调用此方法。
注意,在提供序列化器对象的时候,REST framework会向对象的context属性补充三个数据:request、format、view,这三个数据对象可以在定义序列化器时使用。
详情视图使用:
**get_object(self)**返回详情视图所需的模型类数据对象,默认使用lookup_field
参数来过滤queryset。 在试图中可以调用该方法获取详情信息的模型类对象。
若详情访问的模型类对象不存在,会返回404。
该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。
例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/' ,views.DeptGenManage.as_view())
#正则路由 有名分组(?P<组名>正则表达式)
re_path(r'detail/(?P\d)' ,views.DeptGen.as_view())
#视图
class DeptGenManage(GenericAPIView):
#设置查询集
queryset = Dept.objects.all()
#设置序列化器
serializer_class = DeptSer
lookup_field = 'id'
#获取详细
def get(self,request,id):
#通过id获取一条记录
dept = self.get_object()
ser = self.get_serializer(dept)
return Response(ser.data)
使用基于类的视图的最大好处之一是它使我们能够轻松地组合可重用的行为。
GenericAPIView* 只是提供了数据,对应的访问功能是没有实现的,所以 DRF 还有五个提供方法的混入类,可以完成基本增删改查功能,我们也叫 Mixin 混入类,通过 GenericAPIView* 与混入类的多继承**,可以实现更加复杂的接口功能,GenericAPIView* 提供数据*,而混入类提供操作
列表视图扩展类,提供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)
创建视图扩展类,提供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)
详情视图扩展类,提供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)
更新视图扩展类,提供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)
删除视图扩展类,提供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
#mixin实现添加修改删除
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)
通过使用mixin
类,我们重写了视图,使其使用的代码比以前稍微少一些,但我们还可以更进一步。REST框架提供了一组已经混合在一起的通用视图,我们可以使用它们来进一步精简views.py
模块。
class GenericList(generics.ListCreateAPIView):
queryset = Dept.objects.all()
serializer_class = DeptSer
提供 post 方法
继承自: GenericAPIView、CreateModelMixin
class TeacherCreateView(CreateAPIView):
serializer_class = TeacherCreateSer
提供 get 方法
继承自:GenericAPIView、ListModelMixin
class TeacherListView(ListAPIView):
queryset = Teacher.objects.all() # 你要序列化的哪些数据结果
serializer_class = TeacherListSer # 用什么序列化器
提供 get 方法
继承自: GenericAPIView、RetrieveModelMixin
class GenericList(RetrieveAPIView):
queryset = Dept.objects.all()
serializer_class = DeptSer
lookup_field='id'
提供 delete 方法
继承自:GenericAPIView、DestoryModelMixin
class GenericList(DestroyAPIView):
queryset = Dept.objects.all()
serializer_class = DeptSer
lookup_field='id'
提供 put 和 patch 方法
继承自:GenericAPIView、UpdateModelMixin
class TeacherUpdateView(UpdateAPIView):
lookup_field = 'pk' # 数据库里的字段
queryset = Teacher.objects.all()
serializer_class = TeacherUpdateSer
提供 get、put、patch方法
继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin
提供 get、put、patch、delete方法
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin