Django布尔注释返回重复项

2024-04-27 19:10:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下型号:

class Institution(models.Model):
    pass

class Headquarter(models.Model):
    institution = models.ForeignKey(Institution, related_name='headquarters')

class Audit(models.Model):
    headquarter = models.ForeignKey(Headquarter, related_name='audits')

以下查询(基本上,如果一个机构至少有一次审计,那么has_访问必须为真):

Institution.objects.annotate(
    has_visits=models.Case(
        models.When(headquarters__audits=None, then=False),
        default=True,
        output_field=models.BooleanField()
    )
 )

问题是,如果一个机构有2个审计,那么queryset将返回重复的行。我想这与SQL级别的连接有关,但我不确定如何更正它。我发现了这个answer,但我认为在我的情况下,OuterRef不是我要寻找的。实现这一点的正确方法是什么


Tags: namemodel机构modelspassinstitutionclasshas
1条回答
网友
1楼 · 发布于 2024-04-27 19:10:29

您可以使用^{} subquery [Django-doc]

from django.db.models import Exists, OuterRef

Institution.objects.annotate(
    has_visits=Exists(
        Audit.objects.filter(headquarter__institution=OuterRef('pk'))
    )
)

另一个可能有帮助的方法是让副本“折叠”,例如使用Max

from django.db.models import Max, Value
from django.db.models.functions import Coalesce

Institution.objects.annotate(
    has_visits=Coalesce(Max(models.Case(
        models.When(headquarters__audits=None, then=False),
        default=True,
        output_field=models.BooleanField()
    )), Value(False))
)

但这可能会降低它的可读性和效率

相关问题 更多 >