1. 1. 使用视图组件进行接口优化
    1.1 使用视图组件的mixin进行接口逻辑优化
    - 导入mixin
    from rest_framework.mixinx import (
    ListModelMix,
    CreateModelMixin,
    DestroyModelMixin,
    UpdateModelMixin,
    RetrieveModelMixin
    )
    from rest_framework.generics import GenericAPIView
  2.  
  3. - 定义序列化类
    Class BookSerializer(serializers.ModelSerializer):
    class Meta:
    Book
    fields = ()
    extra_kwargs = {"field_name": {"write_only": True}}
  4.  
  5. - 导入序列化类
    from .app_serializers import BookSerializer
  6.  
  7. - 定义视图类
    class BookView(ListModelMix, CreateModelMixin, GenericAPIView):
    # queryset和serializer_class是固定的写法
    queryset = Book.objects.all()
    serializer_class = BookSerializer
  8.  
  9. def get():
    return self.list()
  10.  
  11. def post():
    return self.create()
  12.  
  13. class BookFilterView(RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin, GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
  14.  
  15. def get():
    return self.retrieve()
  16.  
  17. def delete():
    return self.destroy()
  18.  
  19. def put():
    return self.update()
  20.  
  21. 注意:单条数据操作的url是这样的:re_path(r'books/(?P<pk>\d+)/$, views.BookFilterView.as_view())
  22.  
  23. 实例:
  1. # class BookView(ListModelMixin,CreateModelMixin,GenericAPIView):
  2. # queryset = Book.objects.all()
  3. # serializer_class = BookSerializer
  4. # def get(self,request, *args, **kwargs):
  5. # return self.list(request, *args, **kwargs)
  6. # def post(self,request, *args, **kwargs):
  7. # return self.create(request, *args, **kwargs)
  8. #
  9. # class BookFilterView(RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin, GenericAPIView):
  10. # queryset = Book.objects.all()
  11. # serializer_class = BookSerializer
  12. # def put(self,request,*args,**kwargs):
  13. # # 更改的时候区分一对多还是多对多
  14. # return self.update(request,*args,**kwargs)
  15. # def get(self,request,*args,**kwargs):
  16. # return self.retrieve(request,*args,**kwargs)
  17. # def delete(self,request,*args,**kwargs):
  18. # return self.destroy(request,*args,**kwargs)

class类

  1. class BookSerializer(serializers.ModelSerializer):
  2. class Meta:
  3. model = Book
  4. fields = ('title',
  5. 'price',
  6. 'publish',
  7. 'authors',
  8. 'author_list',
  9. 'publish_name',
  10. 'publish_city'
  11. )
  12. # 如过不加会实在页面显示关联的数字
  13. extra_kwargs = {
  14. 'publish': {'write_only': True},
  15. 'authors': {'write_only': True}
  16. }
  17.  
  18. publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
  19. publish_city = serializers.CharField(max_length=32, read_only=True, source='publish.city')
  20.  
  21. author_list = serializers.SerializerMethodField()
  22.  
  23. def get_author_list(self, book_obj):
  24. # 拿到queryset开始循环 [{}, {}, {}, {}]
  25. authors = list()
  26.  
  27. for author in book_obj.authors.all():
  28. authors.append(author.name)
  29.  
  30. return authors

引入ModelSerializer

  1. #re_path(r'books/$', views.BookView.as_view()),
  2. #re_path(r'books/(?P<pk>\d+)/$', views.BookFilterView.as_view()),

url

  1. 这时,会发现代码可以继续优化
  2.  
  3. 1.2 使用视图组件的view进行接口逻辑优化
    - 导入模块
    from rest_framework import generics
  4.  
  5. - 写视图类
    class BookView(generics.ListCreateAPIView)
    queryset = Book.objects.all()
    serializer_class = BookSerializer
  6.  
  7. class BookFilterView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
  1. # class BookView(generics.ListCreateAPIView):
  2. # queryset = Book.objects.all()
  3. # serializer_class = BookSerializer
  4. #
  5. # class BookFilterView(generics.RetrieveUpdateDestroyAPIView):
  6. # queryset = Book.objects.all()
  7. # serializer_class = BookSerializer

代码优化

  1. # path("course/",views.BookView.as_view()),
  2. # re_path("course/(?P<pk>\d+)/",views.BookFilterView.as_view())

url

  1.  
  2. 1.3 使用视图组件的viewset进行接口逻辑优化
    - 导入模块
    from rest_framework.viewsets import ModelViewSet
  3.  
  4. - 设计url
    re_path(r'books/$, views.BookView.as_view({
    'get': 'list',
    'post': 'create'
    })),
    re_path(r'books/(?P<pk>\d+)/$', views.BookView.as_view({
    'get': 'retrieve',
    'delete': 'destroy',
    'put': 'update'
    }))
  5.  
  6. - 设计视图类
    class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
  1. class BookView(ModelViewSet):
  2. queryset = Book.objects.all()
  3. serializer_class = BookSerializer

最终版

  1. re_path("course/$",views.BookView.as_view({
  2. "get":"list",
  3. "post":'create',
  4. })),
  5. re_path("course/(?P<pk>\d+)/",views.BookView.as_view({
  6. 'get':'retrieve',
  7. 'put':"update",
  8. 'delete':"destroy"
  9. }))

urls

  1.  

django rest framework 解析器组件 接口设计,视图组件 (2)的更多相关文章

  1. django rest framework 解析器组件 接口设计,视图组件 (1)

    一.解析器组件 -解析器组件是用来解析用户请求数据的(application/json), content-type 将客户端发来的json数据进行解析 -必须适应APIView -request.d ...

  2. Django REST framework - 解析器和渲染器

    目录 Django REST framework - 解析器和渲染器 解析器 Django中的数据解析 DRF中的解析器 渲染器 Django REST framework - 解析器和渲染器 解析器 ...

  3. 07 Django REST Framework 解析器与渲染器

    01-解析器 REST 框架包括一些内置的Parser类,允许你接受各种媒体类型的请求.还支持定义自己的自定义解析器,这使你可以灵活地设计API接受的媒体类型. 注意: 开发客户端应用程序时应该始终记 ...

  4.  Django REST framework解析器和渲染器

    解析器 解析器的作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 在了解解析器之前,我们要先知道Accept以及ContentTy ...

  5. 3- vue django restful framework 打造生鲜超市 - model设计和资源导入

    3- vue django restful framework 打造生鲜超市 - model设计和资源导入 使用Python3.6与Django2.0.2(Django-rest-framework) ...

  6. spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器)

    spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器) 资源绑定视图解析器 + 内部资源(普通模式)视图解析器 并存方式 内部资源视图解析器: http:// ...

  7. admin源码解析以及仿照admin设计stark组件

    ---恢复内容开始--- admin源码解析 一 启动:每个APP下的apps.py文件中. 首先执行每个APP下的admin.py 文件. def autodiscover(): autodisco ...

  8. 序列化组件(get/put/delete接口设计),视图优化组件

    一 . 知识点回顾 1 . 混入类 , 多继承 class Animal(object): def eat(self): print("Eat") def walk(self): ...

  9. rest framework 解析器,渲染器

    解析器 解析器的作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 请求体相关字段: Accept:指定了接收的数据类型 Conte ...

随机推荐

  1. MySQL实战45讲学习笔记:第二十八讲

    一.读写分离架构 在上一篇文章中,我和你介绍了一主多从的结构以及切换流程.今天我们就继续聊聊一主多从架构的应用场景:读写分离,以及怎么处理主备延迟导致的读写分离问题. 我们在上一篇文章中提到的一主多从 ...

  2. [LeetCode] 772. Basic Calculator III 基本计算器之三

    Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...

  3. Metasploit 常用命令手册

    Installation curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/template ...

  4. withDefaultPasswordEncoder() 过时弃用问题

    在学springsecurity5.X时,在demo里,内存配置用户的时候,提示withDefaultPasswordEncoder过时,特查看了源码,官方给出的理由是: /** @deprecate ...

  5. java while 循环

    public class Sample { public static void main(String[] args) { ; ) { System.out.print(num + " & ...

  6. mac 下使用shell 命令 jq 解析json

    官网 https://stedolan.github.io/jq/download/ 安装 brew install jq 创建json文件,file.json { , "msg" ...

  7. redis在项目中的应用

    redis在项目中的应用  ps:PHP 会自动 关redis连接 不需要手动关 对于临时的数据 可以不经过数据库直接redis上操作<pre>/*消息队列实例 消息队列详细步骤在http ...

  8. 2018年Java面试题整理

    面试是我们每个人都要经历的事情,大部分人且不止一次,这里给大家总结最新的2018年面试题,让大家在找工作时候能够事半功倍.  1. Switch能否用string做参数? a. 在 Java 7 之前 ...

  9. OpenGL笔记(4)纹理

    纹理单元的理解 Shader中要用到纹理: uniform sampler2D texture1; Main读取图片数据,创建了纹理: unsigned int texture1; 怎么把c++里加载 ...

  10. Java集合Collection基本方法

    jdk1.7 api中的方法摘要: 参考java集合大全图:https://www.cnblogs.com/xkzhangsanx/p/10889114.html Collection为List.Se ...