代码之家  ›  专栏  ›  技术社区  ›  Ben Davis

Django抱怨在子查询中使用查询时,必须在子查询中使用查询

  •  1
  • Ben Davis  · 技术社区  · 7 年前

    我有以下习惯 QuerySet Program :

    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: This queryset contains a reference to an outer query and may only be used in a subquery.

    回溯显示使用 Subquery . 这与Django文档中关于如何使用 . 知道我做错了什么吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Bobby Eickhoff    7 年前

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

    问题似乎在这里:

    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]