2017-12-18 6 views
0

私は小さなアンケートアプリを書いた。 Django 2.0へのアップグレード時に例外が発生するクエリがあります。この複雑なクエリのどこでoutput_field kwargを指定しますか?

Expressionには混合型が含まれています。 output_fieldを設定する必要があります。

ここではいくつかの関係は、クエリを理解する必要があります(ここで、--fk--> indicats外部キー):

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まで大丈夫です、私はFCountモデルしか持っていないので、output_field kwargをどこに追加すればいいのかわかりません。 Countは定義でIntegerFieldを出力し、そのkwargを追加しようとするとFが文句を言う。

これを修正するにはどうすればよいですか?

+1

この[リンク](https://code.djangoproject.com/ticket/24485は)あなたに – Gahan

+0

感謝を助けるかもしれない、それはそれだったまさにです。その機能の背後にある歴史的背景を見るために冷静に。 – Escher

答えて

0

@ 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() 
) 
関連する問題