我应该在哪里指定这个复杂查询中的output_field kwarg?

时间:2017-12-18 09:37:59

标签: django

我写了一个小调查应用程序。我有一个查询,在升级到Django 2.0时会导致异常:

  

表达式包含混合类型。您必须设置output_field。

这里有一些理解查询所需的关系(其中--fk-->表示外键):

response --fk--> question --fk--> survey
response --fk--> person

这是我的疑问:

answered_surveys = SurveyResponse.objects.all()\
    .values('fk_question__fk_survey__hash', 'fk_question__fk_survey__name')\
    .annotate(
        nb_respondants = Count('fk_person', distinct=True),
        survey_name = F('fk_question__fk_survey__name'),
        survey_hash = F('fk_question__fk_survey__hash')
    )\
    .annotate(
        completion=100*Count('id')/
        (F('nb_respondants')*F('fk_question__fk_survey__nb_questions_per_survey'))
    )

直到最后annotate为止一直很好,但我不知道在哪里添加output_field kwarg,因为我只有F和{{1 }} 楷模。 Count根据定义输出一个IntegerField,如果我尝试添加那个kwarg,则会抱怨。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

感谢@ Gahan的评论,我发现我需要使用ExpressionWrapper对注释中的F对象执行算术运算。文档here

最后一部分因此变成:

.annotate(
    completion=ExpressionWrapper(
        100*Count('id')\
        (F('nb_respondants')*F('fk_question__fk_survey__nb_questions_per_survey')),
    output_field=FloatField()
)