在之前学习的视图实现数据增删改查中,发现有很多方法相同,只是其中引用的数据库,序列化器不同,视图基类就是简化相同的代码
1.GenericAPIView
继承自APIView
from rest_framework.generics import GenericAPIView
1.列表、详情视图通用属性
- queryset :指定查询对象
- serializer_class: 指定序列化器
2.列表视图单独属性
- pagination_class: 进行分页设置
- filter_backends: 对数据进行字段过滤
3. 详情页视图单独属性
- lookup_url_kwarg:指定路由传递的参数
- lookup_field :指定过滤的ORM参数
4.列表与详情视图通用方法
- get_queryset(self):返回视图使用的查询集;默认返回queryset属性,支持重写
- get_serializer_class(self):返回序列胡器类
- get_serializer(self, args,
**kwargs
):返回序列化器对象
4.详情页视图单独方法
- get_object(self):返回模型类对象,默认使用lookup_field参数过滤queryset;
2.混入类与扩展类
GenericAPIView提供数据,Mixin混入类提供操作
1.ListModelMixin
- 列表视图扩展
- Mixin的list方法对数据进行过滤
2.CreateModelMixin
- 实现创建数据视图
3.UpdateModelMixin
- 更新视图
4.DestroyModelMixin
- 删除视图
5.混入类与GenericAPIView的组合使用
在使用混入类时需要指定GenericAPIView数据
3.扩展类的应用(重点)
使用之前需要导入
from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView
1.ListModelMixin
- 获取多条数据,提供post方法
2.CreateAPIView
- 创建一条数据,提供post方法
3.RetireveAPIView
- 获取某个数据,get方法
4.DestoryAPIView
删除某个数据,提供delete
5.UpdateAPIView
更新数据,提供put和patch方法
6.ListCreateAPIView
可以创建和获取列表数据
class PeopleView(ListCreateAPIView):
# 指定查询结果集
queryset = People.objects.all()
# 指定序列化器
serializer_class = PeopleSerializer2
7.RetrieveUpdateAPIView
可以获取也可以更新数据
8.RetrieveDestroyAPIView
可以获取也可以删除
9.RetrieveUpdateDestoryAPIView
class PeopleView2(RetrieveUpdateDestroyAPIView):
# 指定查询结果集
queryset = People.objects.all()
# 指定序列化器
serializer_class = PeopleSerializer2
# 省略这两行代码要把路由id改成pk
# # 指定动态参数
# lookup_url_kwarg = 'id'
# # 指定过滤ORM字段
# lookup_field = 'id'
如果是两个表,根据外键查数据在定义一个视图就好
视图
from rest_framework.views import APIView
from rest_framework.response import Response
from student.models import Teacher,Student
from student.serializer import TeacherSerializer,StudentSerializer,StudentSerializer2
from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView,ListAPIView
# 使用扩展类对代码进行简化
# 查询全部,增加数据
class TeachersView(ListCreateAPIView):
# 1.指定查询结果
queryset = Teacher.objects.all()
# 2.指定序列化器
serializer_class = TeacherSerializer
# 查询单个,修改,删除
class TeacherView(RetrieveUpdateDestroyAPIView):
queryset = Teacher.objects.all()
serializer_class = TeacherSerializer
lookup_url_kwarg = 'id' # 指定动态参数名
lookup_field = 'id' # 指定过滤的ORM字段
class StudentsView(ListCreateAPIView):
queryset = Student.objects.all()
serializer_class = StudentSerializer
class StudentView(RetrieveUpdateDestroyAPIView):
queryset = Student.objects.all()
serializer_class = StudentSerializer
# 查询学生信息时,外键字段为老师的名字
class StudentView2(ListAPIView):
queryset = Student.objects.all()
serializer_class = StudentSerializer2
class StudentView3(APIView):
# 根据老师id查询对应学生信息
def get(self,request,id):
stu_data = Student.objects.filter(teacher_id=id)
ser = StudentSerializer2(instance=stu_data,many=True)
return Response(ser.data,status=200)
路由
from django.urls import path
from student import views
urlpatterns = [
path('stu/<int:id>/',views.StudentView3.as_view()), # 根据老师id获取学生信息
path('teacher/',views.TeachersView.as_view()),
path('teacher/<int:id>/',views.TeacherView.as_view()),
path('student/',views.StudentsView.as_view()),
path('student/<int:pk>/',views.StudentView.as_view()),
path('student2/',views.StudentView2.as_view()),
]