ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Django REST Framework——5. 视图与路由

2021-12-18 20:30:02  阅读:190  来源: 互联网

标签:get REST Framework book 视图 方法 class serializer


文章目录


基于类的视图的一个关键好处是:它们允许您组合一些可重用的行为。而DRF通过提供大量预构建的视图来利用这一点,为我们提供了一些常用的模式,我们要做的就是选择合适的视图类进行继承即可。

一、APIView类

DRF提供的APIView类是Django的View类的子类。它和一般的View类有以下不同:

  • 被传入到处理方法的请求不是Django的HttpRequest类的实例,而是DRF的Request类的实例。
  • 处理方法可以返回DRF的Response,而不只是Django的HttpRequest。视图会管理内容协议,给响应设置正确的渲染器。
  • 任何APIException异常都会被捕获,并且传递给合适的响应。
  • 传入的请求将经过身份验证,并在将请求分派给处理方法之前运行适当的权限或限频检查。

使用APIView类和使用一般的View类非常相似,通常,传入的请求会被分发到合适的处理方法比如get()post()。我们之前一直的视图,都是继承了APIView

二、GenericAPIView类

此类是APIView的子类,对APIView类进行了扩展,添加了一些具体通用视图(后面会学到,每个视图都有具体的应用场景)都会用到的的方法。而每个具体通用视图则是通过将GenericAPIView与一个或多个mixin类组合来构建的,即GenericAPIView与这些mixin类是具体通用视图的父类。

2.1 常用属性

  • queryset:

    设置从该视图返回对象的查询集。 比如queryset = Book.objects,之后就会从该查询集中获取模型对象。

    必须设置该属性或者重写get_queryset()方法

    如果要覆盖一个视图方法,那么就应该调用get_queryset()方法而不是直接访问该属性,这是很重要的。因为DRF第一次求出queryset的值后,就会缓存起来给所有后续的请求使用。

  • serializer_class:

    设置用于验证、反序列化输入以及序列化输出的Serializer类必须设置此属性或者重写get_serializer_class() 方法

  • lookup_field:查找单个模型对象时,参考的字段。默认是'pk'

    也就是说,从路由捕获到参数命名为pk后,传入视图中,在按照pk获取模型对象时,DRF会自动将pk作为查找条件找出目标对象。不需要我们再去写filter(pk=pk)了。

2.2 常用方法

  • get_object(self)

    queryset属性设置的模型类获取基本查询集,然后使用lookup_field属性过滤基本查询集,最后返回一个对象实例。

  • get_queryset(self)

    返回由queryset属性指定的模型类的查询集。

  • get_serializer_class(self)

    默认返回serializer_class属性的值,即指定的序列化器类。

  • get_serializer(self, instance=None, data=None, many=False, partial=False)

    返回serializer_class属性指定的序列化器类的实例。

我们还是通过一个书籍相关的例子来理解上面的方法(模型类和序列化器类不是重点,自己写啊

标签:get,REST,Framework,book,视图,方法,class,serializer
来源: https://blog.csdn.net/qq_39330486/article/details/122016564

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有