gpt4 book ai didi

python - Django 提示查询必须在子查询中使用,当它在子查询中使用时

转载 作者:太空宇宙 更新时间:2023-11-03 21:47:36 25 4
gpt4 key购买 nike

我有一个名为 Program 的模型的以下自定义 QuerySet 方法:

def with_volunteer_stats(self):
from programs.models import Session
volunteers_needed = ExpressionWrapper(
F('num_student_seats') / F('student_volunteer_ratio'),
output_field=models.IntegerField())

sessions = (
Session.objects.filter(program_id=OuterRef('pk'))
.annotate(num_volunteers=Count('volunteer_attendances__volunteer', distinct=True))
.order_by('num_volunteers')
)
qs = self.annotate(
volunteers_needed=volunteers_needed,
least_volunteers=Subquery(sessions.values('num_volunteers')[0])
).annotate(
remaining_volunteers_needed=(F('volunteers_needed') - F('num_volunteers'))
)
return qs

运行此程序时,出现异常:

ValueError:此查询集包含对外部查询的引用,并且只能在子查询中使用。

回溯显示使用子查询评估行时发生的异常。这与 Django 文档中有关如何使用 Subquery 的示例非常接近。你知道我做错了什么吗?

最佳答案

我也遇到了同样的问题。现在我对发生的事情有了更好的了解,我想我应该为后代添加一个解释。

问题似乎出在这里:

Subquery(sessions.values('num_volunteers')[0])
# ^^^

其目的是为子查询提供一个查询集,但实际发生的情况是项目访问器强制过早求值。换句话说,这会产生一个查询集:

sessions.values('num_volunteers')

但这会强制评估产生一个对象:

sessions.values('num_volunteers')[0]

这意味着 sessions.values('num_volunteers') QuerySet 在子查询的上下文之外进行评估。因此,如果不清楚的话,错误消息是正确的。

根据下面 mfrackowiak 的评论,Django 文档提供了有关如何 limit the subquery to a single row 的建议:

sessions.values('num_volunteers')[:1]

关于python - Django 提示查询必须在子查询中使用,当它在子查询中使用时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52373674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com