加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql – Django查询返回两次相同的对象

发布时间:2020-12-11 23:29:48 所属栏目:MySql教程 来源:网络整理
导读:通用的例子.当我这样做一个查询 a = MyObject.objects.filter(...) a将包含过滤器匹配的所有内容.当我这样做时: a.filter(...) a只包含与两个过滤器匹配的对象,对吧?所以在第一个filter()之后,我可能有5个元素,然后在第二个filter()之后我可能剩下5个中的2

通用的例子.当我这样做一个查询

a = MyObject.objects.filter(...)

a将包含过滤器匹配的所有内容.当我这样做时:

a.filter(...)

a只包含与两个过滤器匹配的对象,对吧?所以在第一个filter()之后,我可能有5个元素,然后在第二个filter()之后我可能剩下5个中的2个?

我的一个查询得到了奇怪的结果.以下查询:

>>> Item.objects.filter(account__in=Account.objects.filter(customer=a),disabled=False)
[

这产生了一个结果.请记住,100396是主键,因此只有一个具有此idnetifier的Item.现在,当我应用一个额外的过滤器时,该过滤器应仅显示已禁用的发票上的项目或没有发票:

>>> Item.objects.filter(account__in=Account.objects.filter(customer=a),disabled=False).filter(Q(iteminv__invoice__disabled=False) | Q(iteminv__isnull=True))
[

我用同一个对象得到这个结果两次……这怎么可能?我误解了什么吗?

将它全部放在一个filter()中会产生相同的奇怪输出:

>>> Item.objects.filter(Q(account__in=Account.objects.filter(customer=a)),Q(disabled=False),Q(iteminv__invoice__disabled=False) | Q(iteminv__isnull=True))
[

Django版本1.6.2 最佳答案 由于在多对多关系上进行过滤时所涉及的连接或反向外键关系实例在结果集中可能出现两次(在这种情况下,Django将主要应用INNER JOIN,这可能会产生重复).因此,您应该在查询集上使用distinct(). (sql查询中的联接使项目出现在表中,表示它与Account的每个关系.)

另请参阅the examples in the django documentation以了解多对多关系.

编辑:如果您想使用SQL /和/或检查生成的查询,请执行类似打印Item.objects.filter(your_query).query的操作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读