【问题标题】:Django: Extending Querysets / Connect multiple filters with ORDjango:扩展查询集/使用 OR 连接多个过滤器
【发布时间】:2010-12-11 08:57:56
【问题描述】:

我必须使用已经过滤的查询集,例如。 qs = queryset.filter(language='de') 但在进一步的操作中,我需要撤消一些已经应用的过滤,例如,不要只采用 language='de' 的行,而是采用所有语言的条目。有没有办法再次应用过滤器并将新参数连接到使用 OR 不添加的现有参数,例如。如果查询集已经被过滤为 language='de' 并且我可以将 'OR language='en' 连接到那个,它会给我我正在寻找的东西! 谢谢!

【问题讨论】:

    标签: python django filter django-queryset


    【解决方案1】:

    我不相信按照你的要求去做。

    你在 django 中做 OR 的方式是这样的:

    Model.objects.filter(Q(question__startswith='Who') | Q(question__startswith='What'))
    

    所以如果你真的想这样做:

    Model.objects.filter(Q(language='de') | Q(language='en'))
    

    你需要把它们都放在同一个 filter() 调用中,这样你就不能在以后的 filter() 调用中添加另一个 or 子句。

    我认为您可能尝试这样做的原因可能是您担心再次访问数据库,但获得准确结果的唯一方法是再次访问数据库。

    如果您只关心生成干净、干燥的代码,您可以将两个查询共有的所有过滤器放在顶部,然后“分叉”该查询集,如下所示:

    shared_qs = Model.objects.filter(active=True)
    german_entries = shared_qs.filter(language='de')
    german_and_english = shared_qs.filter(Q(language='de') | Q(language='en'))
    

    【讨论】:

    • 这也是我的想法,我可以使用 Q 在一个过滤器中进行“或”查询!只是想知道是否还有另一种可能!谢谢!
    • 看起来不像,但如果您使用 m2m 关系,请仔细阅读这些文档,它们很棘手:docs.djangoproject.com/en/dev/topics/db/queries/…
    猜你喜欢
    • 2014-10-25
    • 2018-02-21
    • 1970-01-01
    • 2014-12-13
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 2019-07-29
    相关资源
    最近更新 更多