gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 06:39:57 25 4
gpt4 key购买 nike

通用示例。当我做这样的查询时

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)
[<Item: PSN-100396>]

这会产生一个结果。请记住,100396 是主键,因此只能有一个 Item 具有此标识符。现在,当我应用一个额外的过滤器时,它应该只显示禁用发票或没有发票的那些项目:

>>> Item.objects.filter(account__in=Account.objects.filter(customer=a), disabled=False).filter(Q(iteminv__invoice__disabled=False) | Q(iteminv__isnull=True))
[<Item: PSN-100396>, <Item: PSN-100396>]

我用同一个对象两次得到这个结果......这怎么可能?我是不是误会了什么?

将所有内容放在一个 filter() 中会产生相同的奇怪输出:

>>> Item.objects.filter(Q(account__in=Account.objects.filter(customer=a)), Q(disabled=False), Q(iteminv__invoice__disabled=False) | Q(iteminv__isnull=True))
[<Item: PSN-100396>, <Item: PSN-100396>]

Django 版本 1.6.2

最佳答案

由于在过滤多对多关系或反向外键关系时涉及连接,实例可能会在结果集中出现两次(在这种情况下,Django 将主要应用 INNER JOIN,它可以产生重复)。因此,您应该在查询集上使用 distinct()。 (sql 查询中的连接使 Item 出现在表中,因为它与 Account 的每个关系。)

另见 the examples in the django documentation用于过滤多对多关系。

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

关于mysql - Django 查询两次返回相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22960217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com