Django QuerySet 包含重复的条目

Posted

技术标签:

【中文标题】Django QuerySet 包含重复的条目【英文标题】:Django QuerySet contains duplicate entries 【发布时间】:2015-08-09 19:26:33 【问题描述】:

我正在尝试使用 django 的 ORM 检索表格的一些内容。

results = Table.objects.using('production').filter(foreign_id=76)
results.count()  # 129807

此表的id 列是主键,因此具有唯一条目。但是,返回的 QuerySet 有重复的条目:

results[7999].id  # 27177397
results[121679].id  # 27177397

不只是重复的id,而是整个行。其实QuerySet的最后8000个结果都是重复的(我想的是前8000个但我没有验证)。

当然,我已经验证了表中的id 列是唯一的,并且当直接使用sql(或通过django ORM)查询27177397 时,我只会得到一个结果。

results = Table.objects.using('production').filter(id=27177397, foreign_id=76)
results.count()  # 1

这怎么可能?

我正在使用 django 1.6.7 和 pyscopg2 2.5.3。

【问题讨论】:

【参考方案1】:

按外键过滤会强制加入(此外,默认顺序可以诱导加入)。使用distinct 删除重复行:

results = ( Table
            .objects
            .using('production')
            .filter(foreign_id=76)
            .order_by()
            .distinct()
            )

【讨论】:

哦,我明白了,我过去两天用来缩小这个可怕的结果是因为 django 可以进行神秘的连接。这就说得通了。我喜欢那个功能。按此过滤..按此排序..您的表连接发生变化!最好不要让它在results.query() 字符串中显示任何指示,否则它就不够神秘。谢谢@danihp,为我解决了这个问题。使用逻辑和推理我永远不会到达那里。

以上是关于Django QuerySet 包含重复的条目的主要内容,如果未能解决你的问题,请参考以下文章

Django Queryset - 按字母顺序排序,然后将特定条目移到顶部

django 模型中每个类别的最新条目

Django Queryset:在优化这组查询方面需要帮助

Django QuerySet OR 语句 [重复]

Django 1.9:为 QuerySet 创建复杂的自定义过滤器方法

Django QuerySet按表达式排序[重复]