网站首页 > 技术文章 正文
用DRF做了一些接口,用到数据的过滤,每次很多fiter就挺烦人的,就琢磨了一个自定义的过滤类,交流一下,要是有高手看到就指点指点,还能怎么继续优化。
通常复杂查询,我习惯post提交,django有一个很好的django-filter库,就是自己使用的不是很习惯,而且django-filter是地址栏提交的,前端也不熟,调试不方便。
在rest_framework的filter已经提供了一个基类BaseFilterBackend,定义了filter_queryset的方法,所以继承BaseFilterBackend后重写这个方法就可以。
在ViewSet里面,我先预定义一个post_fields字典用于提交字段和搜索字段的转换:
class MyViewSets(MyModelViewSets):
filter_backends = [SearchFilterBackend]
my_post_fields = {'name': 'name', 'age':'age__range', 'type':'type__name'}
# 可以直接用 “__” 关联外键。如果需要扩大搜索范围,直接修改my_post_fields的内容就可以。
# 因为是字典定义,前后端提交字段名称完全可以和后端脱离。
过滤器类,主要使用Q对象来实现过滤,Q的默认关系OR,需要指定为AND,Q的条件只要在children的属性append进来就可以。
from rest_framework import filters
from django.db.models import Q
class SearchFilterBackend(filters.BaseFilterBackend):
def get_search_fields(self, view, request):
# 获取自定义的搜索列表
return getattr(view, 'my_post_fields', None)
def filter_queryset(self, request, queryset, view):
# 所有关键字是and关系,提交的字段不在预设范围的忽略,
# 提交一个值就判断相同,提交list类型,就是判断包含其中。
q_and = Q()
q_and.connector = 'AND'
for post_field, model_field in search_fields.items():
if post_field in data and data[post_field] is not None and data[post_field] not in [[], '']:
if type(data[post_field]) == list and not model_field.endswith('__range'):
search_type = '__in'
else:
search_type = ''
q_and.children.append((model_field + search_type, data[post_field]))
queryset = queryset.filter(q_and)
return queryset
自己用下来还觉得挺方便的,欢迎交流
猜你喜欢
- 2025-05-24 使用 sentry 搭建前后端错误监控系统-之react+python 详细指南
- 2025-05-24 手把手搭建koa2后端服务器-API文档生成(番外)
- 2025-05-24 后端编程Python3-文件处理(上)
- 2025-05-24 3分钟看懂Python后端必须知道的Django的信号机制
- 2025-05-24 后端编程Python3-数据库编程
- 2025-05-24 面向开发人员的前5位Python框架
- 2025-05-24 工业设备3D孪生可视化案例:用Python打造的高效后端平台
- 2025-05-24 Flask模块,Python后端最简洁的服务器框架
- 2025-05-24 为何大厂后端开发更青睐 Python 而非 Java 进行爬虫开发?
- 2025-05-24 python后端学什么
- 05-25Python 3.14 t-string 要来了,它与 f-string 有何不同?
- 05-25Python基础元素语法总结
- 05-25Python中的变量是什么东西?
- 05-25新手常见的python报错及解决方案
- 05-2511-Python变量
- 05-2510个每个人都是需要知道Python问题
- 05-25Python编程:轻松掌握函数定义、类型及其参数传递方式
- 05-25Python基础语法
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 90℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 81℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)