DJango filter_queryset
Posted
技术标签:
【中文标题】DJango filter_queryset【英文标题】: 【发布时间】:2019-05-19 12:13:02 【问题描述】:我是 DJango 和 DRF 的新手,我被要求管理一些 DJango/DRF 相关的代码。经过大量搜索后,我仍然无法找到有关 filter_queryset 如何工作以及如何将其与不同参数一起使用的完整示例。
在某些地方我看到它像下面这样使用,
self.filter_queryset(queryset)
在其他地方它与一些参数一起使用。如果有人能够解释基本原理,例如如何以及何时使用它、因变量(lookup_field、filter_backends 等...)和参数是什么以及如何设置它们,将会很有帮助。
我搜索了很多,也浏览了文档。如果我错过了任何文档,请告诉我。
【问题讨论】:
【参考方案1】:filter_queryset()
--(source code) 是一个最初在 GenericAPIView
-- (DRF doc) 类中实现的方法。
def filter_queryset(self, queryset): """ Given a queryset, filter it with whichever filter backend is in use. You are unlikely to want to override this method, although you may need to call it either from a list view, or from a custom `get_object` method if you want to apply the configured filtering backend to the default queryset. """ for backend in list(self.filter_backends): queryset = backend().filter_queryset(self.request, queryset, self) return queryset
我认为从文档字符串中可以清楚地看到该方法的功能。
“.....在其他地方它与一些参数一起使用”
views
的filter_queryset()
方法只接受一个参数,就是要过滤的queryset
。
但是,filter-backends
' filter_queryset()
方法需要三个参数,分别是 request
、queryset
和 @987654338 @ 本身。
什么是过滤后端?
Filterbackends 是帮助我们过滤具有复杂查找和其他一些内容的查询集的类。
DRF 几乎没有内置后端 which can be found here.DRF 官方文档建议使用 django-filter
包进行高级过滤。
过滤器后端如何工作?
看看DjangoFilterBackend
类的源代码和它的方法... filter_queryset(...)
方法在过滤过程中起着关键作用。
我建议通过django-filter 的文档了解更多示例的用法。
通过定义filterset_class
,您可以更好地控制过滤过程(例如提供lookup_expr
等)
【讨论】:
嗨 JPG,感谢您的回答,是的,它确实有帮助。我看到了一些使用 **kwargs 的实现。但现在我怀疑它可能是一个自定义实现。但是,您能否阐明后端如何过滤查询集?在哪里定义的关键字将通过此方法过滤查询集。是否所有关键字都必须匹配或其中任何一个(和/或)。请指导我,让我试用一个小sn-p,我会接受你的回复作为答案..内置的后端代码真的很有帮助。 嘿 JPG!我刚刚设法安装了 django-filter 包并成功过滤了查询集。感谢您的回复,我将其标记为答案,因为它给了我正确的方向。以上是关于DJango filter_queryset的主要内容,如果未能解决你的问题,请参考以下文章