Django将Count注释添加到已过滤的预取相关查询中

时间:2018-08-29 20:28:03

标签: python django

我正在使用Django 1.11版,并且正在尝试执行以下查询。

queryset = Series.objects.prefetch_related(
        Prefetch(
             'issues',queryset=Issue.objects.filter(hide=False)
        )
     )
    .filter(hide=False, issues__hide=False)
    .annotate('issue_count=Count('issues')
)

查询运行得很好,问题是带注释的issue_count值不正确。与其回读预取查询集的计数,不如回读整个相关问题属性。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

在批注中使用Django 1.11时,必须使用子查询来获得所需的过滤关系计数。

queryset = Series.objects.prefetch_related(
            Prefetch('issue_series', queryset=Issue.objects.filter(hide=False).filter(issue_query_set))) \
            .filter(hide=False) \
            .annotate(issue_count=Subquery(
                    Issue.objects.filter(
                        series=OuterRef('pk'),
                        hide=False
                    )
                    .filter(issue_query_set)
                    .values('series')
                    .annotate(cnt=Count('pk'))
                    .values('cnt'),
                    output_field=IntegerField()
                )
            )\
            .filter(issue_count__gt=0)