繁体   English   中英

Django-是否使用某些参数对查询集进行了过滤

[英]Django - was queryset filtered using some parameters or not

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

是的 ,但因为据我所知,这是没有记录,你可能应该使用它。 此外,如果您需要从QuerySet获取它,对我来说,它看起来像是不良的设计。

对于QuerySet ,例如qs ,您可以获取.query属性,然后查询.where属性。 该属性的真实性检查该节点(此属性是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子句。

但是,就我所知,由于上述内容(没有得到广泛记录),因此,依赖于此可能不是一个好主意,因为这意味着它很容易更改,因此不再起作用。

您可以使用query属性(即queryset.query )来获取SQL查询中使用的数据(输出并非完全有效的SQL)。

您还可以使用queryset.query.__dict__以字典格式获取该数据。

我同意Willem Van Onsen的观点,因为不能保证将来访问查询对象的内部。 目前是正确的,但可能会改变。

但是沿着这条道路走一半,您可以使用以下代码:

is_filtered_query = bool(' WHERE ' in str(queryset.query))

这几乎可以完成工作!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM