与外键设置过滤器时标注错误的结果

问题描述 投票:0回答:1

C型有一个外键链接到B型B型有一个外键链接模型A.这是,模型中的实例可能有很多B型实例,B型可能有许多C型实例。

伪代码:

class A:
    ...

class B:
    a = models.ForeignKey(A, ...)

class C:
    b = models.ForeignKey(B, ...)

我想从数据库中检索模型中的元素的完整列表,为B元素的个数有,他们的各个C元素的计数不无注释它(或任何随机数,对于这个问题)。

我尝试这样做:

A.objects.annotate(
    at_least_one_count=Count('b', filter=Q(b__c__isnull=False))
)

据我所知,这应该是工作。然而,返回的数字是不正确的(在实际情况下)。它返回比没有过滤器,这显然是不可能的一个较大的数字:

A.objects.annotate(
    at_least_one_count=Count('b')
)

编辑:当我单独运行下面的查询为每次例如,我得到了相同的数字,这让我觉得有可能是在我的代码一些错误:

A.objects.first().b_set.filter(c__isnull=False).__len__()

注:我想没有SQL执行此查询。如果我要利用一些更高级的Python的工具,Django提供,我很乐意这样做,只要我留面向对象。我试图从移动使用原始SQL所有数据库操作了,并且他们都与Django的ORM重新写。然而,它似乎过于复杂。

python django django-models
1个回答
0
投票

答案很简单:应用该翻译把语句查询后,一个必须执行的过滤器不同,它在Django通过调用.distinct(...)上查询设置完成。

在这种情况下,如果您使用的是过滤器,和不同的限制是在过滤器对象上,那么你要使用:

...=Count('b', filter=Q(b__c__isnull=False), distinct=True)
© www.soinside.com 2019 - 2024. All rights reserved.