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