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

Mih*_*ail 1 python django filter django-queryset

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

Wil*_*sem 6

是的,但因为据我所知,这是没有记录的,你应该使用它.此外,如果您需要从a获得此设计,它看起来像糟糕的设计QuerySet.

例如QuerySet,对于a ,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
Run Code Online (Sandbox Code Playgroud)

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

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

通过寻找孩子们,我们甚至可以获得细节:

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

但这种符号相当神秘.此外,它WhereNode本身不是一个连接的(the AND),它也可以是一个析取的(the OR),并且不会说任何过滤都会被完成(因为测试可以简单地为真,如此1 > 0).因此,我们只查询WHERESQL查询中是否存在非空.不是此查询是否会以任何方式限制查询集(尽管您当然可以检查WhereNode,并查看是否成立).

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

然而,由于上述内容 - 据我所知 - 没有经过深思熟虑的记录,依赖于此可能不是一个好主意,因为这意味着它很容易改变,从而不再有效.