DJango filter_queryset

Sub*_*bbu 6 python django django-queryset django-rest-framework

我是 DJango 和 DRF 的新手,并被要求管理一些与 DJango/DRF 相关的代码。经过大量搜索,我仍然无法找到有关 filter_queryset 如何工作以及如何与不同参数一起使用的完整示例。

在某些地方,我看到它像下面这样使用,

self.filter_queryset(queryset)
Run Code Online (Sandbox Code Playgroud)

在其他地方,它与一些参数一起使用。如果有人可以解释基本原理,例如如何以及何时使用它,什么是因变量(lookup_field、filter_backends 等)和参数以及如何设置它们,那将会很有帮助。

我搜索了很多,也浏览了文档。如果我错过了任何文档,请告诉我。

JPG*_*JPG 6

filter_queryset()- (源代码)是其在最初实施的方法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
Run Code Online (Sandbox Code Playgroud)

我认为从文档字符串中可以清楚地看到该方法的功能。


“......在其他地方,它与一些参数一起使用”

所述viewsfilter_queryset()方法仅采用一个参数,它是queryset要被过滤。

但是,filter-backends'filter_queryset()方法需要三个参数,它们是request,queryset和它view本身。


什么是过滤器后端?
Filterbackends 是帮助我们使用复杂查找和其他一些东西过滤查询集的类。

DRF 很少有内置后端,可以在这里找到。DRF 官方文档建议使用django-filter包进行高级过滤。

过滤器后端如何工作?
看看DjangoFilterBackend类的源代码和它的方法......它的filter_queryset(...)方法在过滤过程中起着关键作用。
我建议您阅读django-filter的文档,以通过更多示例了解相同的用法。

通过定义filterset_class,您可以更好地控制过滤过程(例如提供lookup_expr等)