DRF视图
请求
# 见源码
响应
# Response()参数:
# data,即要返回的数据,字典格式
# status,返回的状态码
# template_name,即自定义模板
# headers,即响应头,可增加数据
# content_type,即响应编码
# 根据请求的user_agent区别响应,可以配置,如无则使用默认配置
# 局部配置:对某个视图类有效
# 在视图类中先加入:
renderer_classes=[JSONRenderer,]
# 全局配置:对所有视图类都有效
# 在settings.py中加入:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ['rest_framework.renderers.JSONRenderer']
}
# drf配置信息查找顺序:先视图类,后项目配置文件,最后默认配置
视图
# 视图基类:ModelViewSet(>GenericViewSet)>GenericAPIView>APIView>View
APIView
# 注册rest_framework
# 在models.py中定义表模型
class Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=6,decimal_places=2)
author = models.CharField(max_length=32)
public = models.CharField(max_length=64)
# 在自定义文件中定义序列化器
from rest_framework import serializers
class BooksSerializer(serializers.Serializer):
name = serializers.CharField()
price = serializers.DecimalField(max_digits=6,decimal_places=2)
author = serializers.CharField()
public = serializers.CharField()
# 在views中定义视图类
class BookView(APIView):
def get(self,request,id):
book = Book.objects.filter(id=id).first()
book_ser = BooksSerializer(book) # 参数就是要序列化的对象
# book_ser.data就是序列化后的字典
return Response(book_ser.data) # 也可以用JsonResponse返回,这样不用注册rest_framework,但不能通过判断请求信息区别渲染
# 配置路由信息
GenericAPIView
class BookDetailView(GenericAPIView):
# queryset = Book.objects.all() # 查询所有
# serializer_class = BookSerializer # 传入自定义序列器
#
# 之后的内部视图函数就可以使用self.get_queryset()、self.get_object()和self.get_serializer()方法,使用self.get_object(),需要路由配置中有名分组必须命名为pk,或者视图类中配置lookup_url_kwarg属性
# 这种方式是可以将查询或者操作资源需要的query对象或者序列器封装到self.中,在之后创建类似的其他表模型的视图函数只需要复制视图类,修改类名及类名中的queryset、serializer_class参数即可
# 但是这样会造成代码重复,所以可以引入已经写好的5个类:
from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
class BookDetailView(GenericAPIView):
def get(self,request):
return self.list(request)
def post(self,request):
return self.create(request)
GenericAPIView的视图子类9个
from rest_framework.generics import CreateAPIView,ListAPIView,DestroyAPIView,UpdateAPIView,RetrieveAPIView,ListCreateAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView,RetrieveUpdateDestroyAPIView # 继承了GenericAPIView,基于基本5种组合而来
class Book(CreateAPIView,ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
# 以上即所有代码
ModelViewSet(ReadOnlyModelViewSet)
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
"""
A viewset that provides default `create()`, `retrieve()`, `update()`,
`partial_update()`, `destroy()` and `list()` actions.
"""
pass
# 继承ModelViewSet创建视图类,多个路由将指向同一个视图类,这时需要指定.as_view()方法中的actions参数,实际上GenericViewSet继承的ViewSetMixin类中重写了.as_view()方法。
源码
# ModelViewSet>GenericViewSet>ViewSetMixin>as_view>view
for method, action in actions.items():
handler = getattr(self, action)
setattr(self, method, handler)
# 循环解压路由传来的actions参数,并为视图类对象的相应方法绑定已经写好的方法的内存地址
ViewSetMixin使用
通过源码,我们看到ViewSetMixin中重写的as_view方法非常快乐,所以我们可以在继承APIView、GenericAPIView创建视图类时直接先继承ViewSetMixin来借用
这样可以多个路由指向我们同一个视图类,并且手动配置请求方式和视图类中函数的对应关系
视图类汇总
两个视图基类:APIView、GenericAPIView
五个视图拓展类(直接继承object类):ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
九个视图子类(继承GenericAPIView和五个视图拓展类中的一个或多个):CreateAPIView,ListAPIView,DestroyAPIView,UpdateAPIView,RetrieveAPIView,ListCreateAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView,RetrieveUpdateDestroyAPIView
五个视图集:GenericViewSet、ModelViewSet、
ReadOnlyModelViewSet、ViewSet、ViewSetMixin
ModelViewSet:五个接口全
GenericViewSet:GenericAPIView+ViewSetMixin
ViewSet:APIView+ViewSetMixin
ViewSetMixin:重写as_view()方法,可以在路由中用actions直接配置请求方式和视图类中具体视图函数的对应关系,手动配置或者使用Router自动配置,当视图类中自定义了视图函数时,可以在视图函数前用@action装饰器,action的参数有methods=[GET,POST]、detail=True,则生成的路由中配置了有名分组pk,需要'/1/get_2'类似的请求,且函数应添加形参pk
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现