混入视图基类

在之前学习的视图实现数据增删改查中,发现有很多方法相同,只是其中引用的数据库,序列化器不同,视图基类就是简化相同的代码

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()),
]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值