【问题标题】:How to edit filters list of a queryset如何编辑查询集的过滤器列表
【发布时间】:2011-03-07 13:46:18
【问题描述】:

此功能在我列出搜索结果的视图中使用。在我的搜索表单中,我有一些 ModelChoiceFields 可以通过外键进行搜索。通常的工作流程意味着将我们当前的搜索变得越来越精确,因此为了禁用许多不相关的结果,我正在尝试删除如果没有其他搜索参数更改则不会返回任何结果的条目。

我正在使用对象查询集来限制某些下拉列表中的命题。 我使用这些下拉列表按外键过滤我的对象列表。

我的过滤函数参数是一个对象查询集,现在:

class MySearchForm(Form):
    things = ModelChoiceField(queryset=models.Thing.objects.none())
    def __init__(self, *args, **kwargs):
        my_objects_queryset = kwargs.pop('my_objects_queryset',models.Thing.objects.all())
        super(MySearchForm, self).__init__(*args, **kwargs)
        self.fields['things'].queryset = \
            models.Thing.objects.filter(object__in=my_objects_queryset).distinct()

我的问题是如何从现有的 query_set 中删除 'where close'。 在这里,我想从 my_objects_queryset 中删除 where closes which filter by thing = ForeignKey(models.Thing)

有可能吗?

类似于列出我们查询集的所有过滤器并即时编辑/删除它们的方法。

【问题讨论】:

  • 很难理解你想要做什么,但也许你正在寻找与filter相反的excludeLink to docs
  • 我有一个带有许多过滤器的查询集,我想在获取对象之前列出它们并删除其中的一些。 exclude 方法不能“禁用”在查询集上制作的过滤器(我是法国人,也许我不清楚)

标签: python django


【解决方案1】:

简答:

不,你不能这样做。

长答案:

理论上,这是可能的(无论如何在某种程度上),但当然不建议

(我还没有完全研究过django源码,所以下面是简单爬上调用树的结果。)

查看source for QuerySetfilter()exclude() 返回带有新规则的查询集本身的克隆(使用clone.query.add_q())。

clone.query 是一个object representing an SQL Query,而add_q() 方法将新规则添加到clone.query.where,它本质上是tree 的根节点。

新节点如何添加到树中取决于规则是与AND 还是OR 子句连接。这很重要,因为它会影响最终 SQL 查询(generated)的正确性。

因此,要列出分配给查询集的过滤器,“简单地”需要了解queryset.query.where 树的表示方式(请参阅django.utils.tree)。

困难的一点当然是删除过滤器,这样它就不会影响剩余的规则。我将避免提供解决方案,因为无法保证实施不会改变,从而使解决方案无效。我怀疑这是可能的,但它闻起来应该是出于学术兴趣才应该做的事情,或者根本不应该做。

【讨论】:

  • 非常有据可查的回复,非常感谢。现在听起来很清楚。
  • “但当然不建议”我同意 :)
【解决方案2】:

这里有一些黑客行为。

您可以通过“重置”当前过滤器来绕过它,如下所示:

from django.db.models.sql.where import WhereNode

qs = YourModel.objects.filter(column=1).all()
qs.query.where = WhereNode() # resets current filters
qs.all() # now you can apply new filters

【讨论】:

    猜你喜欢
    • 2021-10-12
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2022-12-05
    • 2020-05-23
    • 1970-01-01
    相关资源
    最近更新 更多