• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Django REST framework过滤和搜索

Python框架 彭东稳 6年前 (2018-09-14) 27313次浏览 已收录 0个评论

一、过滤

在使用DRF写平台的时候,或多或少都会有过滤的需求。而在DRF中常用的就是django-filter库了,django-filter库包括一个DjangoFilterBackend类,它支持REST Framework的高度可定制的字段过滤。

首先安装django-filter:

然后将django-filters添加到Django的INSTALLED_APPS。在settings.py加上如下配置:

你现在应该将过滤器后端添加到设置中:

或者将过滤器后端添加到单个视图或视图集。

如果你只需要简单的基于等式的过滤,则可以在视图或视图集上设置filter_fields属性,列出你要过滤的一组字段。

这将自动为给定字段创建一个 FilterSet 类,并允许你发出如下请求:

对于更高级的过滤要求,你应该在视图上创建FilterSet类。

 

 

 

此时,就需要设置:

你可以在 django-filter文档中阅读有关FilterSet的更多信息。

二、搜索

过滤大部分都是等值查询或范围查询,当然也可以like查询。但如果要明确指定可以对哪些字段进行搜索,就可以使用search_fields属性,默认为可以对serializer_class属性指定的串行器上的任何可读字段进行搜索,搜索使用的是DRF自己的库,如下代码:

也可以使用双下划线在Foreign Key或ManyToManyField上执行相关查找:

默认情况下,搜索将使用不区分大小写的部分匹配。搜索参数可以包含多个搜索项,它们应该是空格和/或逗号分隔。如果使用多个搜索项,则仅当所有提供的条款匹配时,才会在列表中返回对象。默认情况下,搜索参数被命名为“search”,但这可能会被SEARCH_PARAM设置覆盖。

可以通过在search_fields中加入一些字符来限制搜索行为,如下:

  • ‘^’ :以xx字符串开始搜索
  • ‘=’ :完全匹配
  • ‘@’ :全文搜索(目前只支持Django的MySQL后端)
  • ‘$’ :正则表达式搜索

三、排序

DRF的OrderingFilter类支持简单的查询参数控制结果排序。默认情况下,查询参数被命名为“ordering”,但这可能会被ORDERING_PARAM设置覆盖。

可以使用ordering_fields属性明确指定可以对哪些字段执行排序,这有助于防止意外的数据泄露,例如允许用户对密码散列字段或其他敏感数据进行排序。

如果不指定ordering_fields属性,则默认为可以对serializer_class属性指定的串行器上的任何可读字段进行过滤。

如果在视图上设置了ordering属性,则将用作默认排序。比如默认降序排序:ordering = ('-username',)

关于过滤、搜索、排序的测试工作,都可以在DRF提供的可浏览API页面看到效果,非常好用。

<摘录>

http://drf.jiuyou.info/#/drf/filtering?id=orderingfilter


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (0)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!