Skip to main content
 首页 » 编程设计

python之Django之是否使用某些参数过滤了查询集

2025年05月04日31myhome

与 python - django 框架相关的问题,可能是有经验的 django 开发人员的问题。谷歌了一段时间,也在django queryset本身中寻找,但没有答案。是否有可能知道查询集是否已被过滤,如果是,则获取过滤参数的键值? 我正在开发具有大量过滤器集的 Web 系统,如果某些过滤器受到影响,我必须预定义一些用户背景行为。

请您参考如下方法:

是,但据我所知,这没有记录在案,您可能不使用它。此外,在我看来,如果您需要从 QuerySet 中获取它,那么它的设计很糟糕。

对于QuerySet,例如qs,可以获取.query属性,然后查询.where 属性。该属性的 truthiness 检查该节点(该属性是一个 WhereNode,它是查询语法中的一个节点)是否有子节点(这些子节点是单独的 WHERE条件,或此类条件的组),因此进行了一些过滤。

例如:

qs = Model.objects.all() 
bool(qs.query.where)   # --> False 
 
qs = Model.objects.filter(foo='bar') 
bool(qs.query.where)   # --> True 

如果您检查 WhereNode,您可以看到组成它的元素,例如:

>>> qs.query.where 
<WhereNode: (AND: <django.db.models.lookups.Exact object at 0x7f2c55615160>)> 

通过观察 child ,我们甚至可以获得细节:

>>> qs.query.where.children[0] 
>>> c1.lhs 
Col(app_model, app.Model.foo) 
>>> c1.lookup_name 
'exact' 
>>> c1.rhs 
'bar' 

但是这个符号相当隐晦。此外,WhereNode 本身并不是一个连词(AND),它也可以是一个分离词(OR),并且它并不是说会进行任何过滤(因为测试可以很简单地为真,例如 1 > 0)。因此,我们只查询 SQL 查询中是否有非空 WHERE。不是这个查询是否会以任何方式限制查询集(尽管您当然可以检查 WhereNode,看看它是否成立)。

请注意,某些约束不是 WHERE 的一部分,例如,如果您创建一个 JOIN,您将执行一个 ON,但是这不是 WHERE 子句。

然而,据我所知,由于上述内容没有得到广泛的记录,因此依赖它可能不是一个好主意,因为这意味着它可以很容易地改变,因此不再有效。