首页 > 解决方案 > Django:对外部查询的引用只能在子查询中使用

问题描述

我使用以下查询:

def get_queryset(self):
    posts = Post.objects.filter(topic_id=OuterRef('pk'))
    unread_posts = posts.exclude(read_by=self.request.user)
    return Topic.objects.all().annotate(is_unread=Exists(unread_posts),
                                        number_of_replies=Subquery(posts.count())).order_by('-latest_post')

不幸的是,我收到以下错误消息:

This queryset contains a reference to an outer query and may only be used in a subquery.

我很困惑,因为我明确设置了Subquery(posts.count()).

有人可以给我一个提示吗?

标签: django

解决方案


问题是它.count()会急切地评估查询,因此Subquery(..)从未使用过。但即使这样会奏效,无论如何这样做也不是一个好主意。

你可以用一个 JOIN 来计算,比如:

from django.db.models import Count, Exists, OuterRef

def get_queryset(self):
    posts = Post.objects.filter(topic_id=OuterRef('pk'))
    unread_posts = posts.exclude(read_by=self.request.user)
    return Topic.objects.annotate(
        is_unread=Exists(unread_posts),
        number_of_replies=Count('post')
    ).order_by('-latest_post')

推荐阅读