代码之家  ›  专栏  ›  技术社区  ›  Bernhard Vallant

django:扩展查询集/使用或连接多个筛选器

  •  3
  • Bernhard Vallant  · 技术社区  · 15 年前

    我必须使用一个已经筛选的查询集,例如qs=queryset.filter(language='de'),但是在一些进一步的操作中,我需要撤消一些已经应用的筛选,例如不只接受language='de'的行,而是所有语言的条目。是否有一种方法可以再次应用筛选并使用或不添加将新参数连接到已存在的参数,例如,如果查询集已筛选为language='de',并且我可以将'or language='en'连接到该参数,它将提供我要查找的内容! 谢谢!

    1 回复  |  直到 15 年前
        1
  •  2
  •   sheats    15 年前

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

    你在Django做ORS的方式是这样的:

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

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

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

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

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

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

    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'))