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

时间:2018-09-28 17:11:39

标签: python django filter django-queryset

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

3 个答案:

答案 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))

几乎可以完成工作!