Django:对外部查询的引用只能在子查询中使用

标签 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()) .

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

最佳答案

问题是.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')

关于Django:对外部查询的引用只能在子查询中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57315307/

相关文章:

django - Django包的间歇性ImportError

django - 如何仅将自定义权限与 syncdb 同步?

python - 'Pedido_Extra' 对象没有属性 'update'

django - 如何访问 Django 模板中的页面标题?

django - 为我所有的模型添加一个属性

python - 在新的virtualenv中安装wheel软件包时,导入旧django项目模型的任何方法

python - 将 Django 模型属性名称传递给函数

python - 将使用 SubFactory 和 LazyAttribute 创建的对象传递给 factory_boy 中的 RelatedFactory

python - Django 不向电子邮件发送错误消息

python - 如何检查django中for循环的重复行