【问题标题】:Django filter, filter return more than this sourcedjango过滤器,过滤器返回的比这个源多
【发布时间】:2018-09-16 06:55:14
【问题描述】:
    print("Step 1",invs.count()) # -> 1000 # invs type: query
    invs2 = invs.filter(field___fields2__fields3=i) # i type:int
    print("Step 2",invs2.count()) # -> 40000

过滤器函数返回多于其原点是否正常?

谢谢。

【问题讨论】:

  • 试试invs2.distinct().count()

标签: django filter orm


【解决方案1】:

相关信息可以在distinct()的描述中找到。
引用:

返回一个在其 SQL 查询中使用 SELECT DISTINCT 的新 QuerySet。这会消除查询结果中的重复行。

默认情况下,QuerySet 不会消除重复行。实际上,这很少会成为问题,因为像 Blog.objects.all() 这样的简单查询不会引入重复结果行的可能性。 但是,如果您的查询跨越多个表,则在评估 QuerySet 时可能会得到重复的结果。这时您将使用 distinct()。

【讨论】:

    【解决方案2】:

    是的,文档中有一个完整的部分来解释它

    Lookups that span relationships

    在“跨越多值关系”标题下方的大绿色注释块内

    但是,与使用 filter() 时的行为不同,这不会根据满足这两个条件的条目来限制博客。为了做到这一点,即选择所有不包含 2008 年发布的以“Lennon”发布的条目的博客,您需要进行两个查询:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-15
      • 2011-11-29
      • 2022-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      相关资源
      最近更新 更多