如何在Django后端使用预定义FilterSet过滤QuerySet?
Django中使用预定义FilterSet过滤已有QuerySet的正确方式
你可以直接使用预定义的FilterSet来过滤已有QuerySet,无需重复编写过滤逻辑。你的代码未生效是因为几个关键错误,以下是修正后的实现方式:
问题代码中的错误点
- 拼写错误:
User.object.all()应为User.objects.all()(少了s) - 数据源错误:你传入了
request.GET,但实际过滤参数是自定义的filters字典,应该将该字典作为data参数传入UserFilter - 错误调用过滤方法:无需手动调用
filter_queryset,FilterSet的.qs属性会直接返回经过过滤后的合法QuerySet
正确实现代码
情况1:使用自定义参数字典过滤
def post(self, request, **kwargs): # 初始化原始QuerySet(注意objects的拼写) qs = User.objects.all() # 自定义过滤参数字典 filters = {"q": "john doe", "score_min": 5, "score_max": 10} # 正确初始化FilterSet,传入自定义参数和原始QuerySet user_filter = UserFilter(data=filters, queryset=qs) # 验证参数合法性(推荐执行,避免非法参数) if user_filter.is_valid(): # 直接从FilterSet获取过滤后的QuerySet qs = user_filter.qs # 后续处理过滤后的qs,比如序列化返回等 ...
情况2:从前端POST请求获取参数过滤
如果过滤参数是前端通过POST请求传递的,直接使用request.POST作为数据源即可:
def post(self, request, **kwargs): qs = User.objects.all() # 从POST请求中获取过滤参数 user_filter = UserFilter(data=request.POST, queryset=qs) if user_filter.is_valid(): qs = user_filter.qs # 后续处理 ...
补充说明
UserFilter初始化时,data参数接收键值对形式的过滤参数,queryset参数传入需要被过滤的原始QuerySet.is_valid()方法会验证参数的类型和合法性,验证通过后.qs属性才会返回正确的过滤结果;如果参数不合法,.qs会返回原始QuerySet- 你定义的
text_search_filter等自定义过滤方法会自动被FilterSet调用,无需额外处理
内容的提问来源于stack exchange,提问作者Nyta
相关产品推荐
相关产品推荐

