与python-django框架有关的问题,可能与有经验的django开发人员有关。用谷歌搜索了一段时间,也在django queryset本身中寻求,但没有答案。是否有可能知道queryset是否已过滤,如果是,则获取过滤参数的键值? 我正在开发具有庞大过滤器集的Web系统,如果某些过滤器受到影响,则必须预先定义一些用户背景行为。
答案 0 :(得分:5)
是,但是据我所知,未未对此进行记录,因此您可能应该不使用它。此外,如果您需要从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>)>
通过寻找孩子,我们甚至可以获得详细信息:
>>> 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
条款。
但是,就我所知,由于上述内容尚未得到广泛记录,因此依赖于此可能不是一个好主意,因为这意味着它很容易更改,因此不再起作用。
答案 1 :(得分:1)
您可以使用query
属性(即queryset.query
)来获取SQL查询中使用的数据(输出并非完全有效的SQL)。
您还可以使用queryset.query.__dict__
以字典格式获取该数据。
答案 2 :(得分:1)
我同意Willem Van Onsen的观点,因为不能保证将来访问查询对象的内部。目前是正确的,但可能会改变。
但是沿着那条路走一半,您可以使用以下代码:
is_filtered_query = bool(' WHERE ' in str(queryset.query))
几乎可以完成工作!