Djangoクエリセット-.extra()の後に.annotate()を使用する

Wannabeコーダー

このような非常に単純なモデルがあるとしましょう。

class Test(models.Model):
    category = models.CharField(unique=True)
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()

基本的に、DjangoのORM APIを使用して、カテゴリごとの平均期間を取得したいと思います。SQLクエリは次のようになります。

SELECT category, AVG(end_time - start_time) AS avg_duration
FROM test_table
GROUP BY category

次のコードを使用してみましたが、ドキュメントによると、.annotate()のF()式はDjano1.8でのみ使用できます。

Test.objects.values('category', 'start_time', 'end_time').annotate(avg_duration=Avg(F(end_time) - F(start_time))

このように.extra()も使用してみましたが、FieldErrorが発生します。

Test.objects.extra(select={'duration':'end_time - start_time'}).values('category', 'duration').annotate(avg_duration=Avg('duration'))

見た目から、2回目の試行は、注釈関数が列エイリアスを解決できないことを示唆しています。これは本当に本当ですか、それとも私は何かが足りないのですか?

さらに、派生情報(エントリごとの期間)を格納する追加の列を作成したり、Django 1.8を使用したり、生のSQLを使用したりする以外に、他にどのような代替案をお勧めできますか?どんな助けでも大歓迎です。ありがとう!

Todor

これを試して:

Test.objects.values('category').extra(select={'avg_duration':'AVG(end_time - start_time)'})

うん、それは起こらない、なぜなら

values()呼び出しの後に行われたextra()呼び出しでは、余分に選択されたフィールドは無視されます。

.values()に含める必要があるため、以前は使用できません.values()

extra()呼び出しの後にvalues()句を使用する場合、extra()のselect引数で定義されたフィールドは、values()呼び出しに明示的に含める必要があります。

したがって、このようにして、すべての.extra選択がグループ化に含まれます

でも、そういうものがないと作れAvgない.extraので、残った解決策は使うことだけだと思います.raw

Test.objects.raw('\
    SELECT id, category, AVG(end_time - start_time) AS avg_duration \
    FROM test_table \
    GROUP BY category'
)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Djangoクエリセットを効率的に使用する方法

分類Dev

Djangoでクエリセットの順序を逆にする

分類Dev

django-リストをクエリセットに戻す

分類Dev

Django RestFrameworkのModelViewSetのクエリセットを変更する

分類Dev

Djangoのクエリセットを理解する際の問題

分類Dev

Django:クエリセットにデータを追加する

分類Dev

Djangoクエリセットを逆にする方法

分類Dev

2つのDjangoクエリセットを結合する

分類Dev

別のdictでDjangoクエリセットを注文する

分類Dev

クエリセットデータを別のクエリdjangoに渡す

分類Dev

Django:クエリセットを注文していくつかのアイテムをクエリセットの最後に移動する方法

分類Dev

あるクエリセットを別のクエリセットから除外するDjango

分類Dev

Django 1.11:クラスを使用してクエリセットをcsvにエクスポートする

分類Dev

Djangoクエリセット:クエリセットの2番目の値を出力する方法は?

分類Dev

Djangoのモデルクエリセットでself.request.userを使用する

分類Dev

Django:ListViewを使用してクエリセットに最後に追加された日付を追加する方法

分類Dev

Django annotate + SUMすべてのエントリを取得する方法

分類Dev

djangoのクエリセットでサブクエリする方法は?

分類Dev

'pk'を使用したModelFormのDjangoクエリセット

分類Dev

Djangoクエリセットはクエリで空の値を取得します

分類Dev

Django / PythonでManyToManyクエリセットに参加する方法

分類Dev

djangoクエリセットで使用する属性フィールドのエイリアスを作成する

分類Dev

Djangoのget_queryset()でクエリセットを返す方法

分類Dev

クエリの前に自動コミットを変更し、クエリの後にリセットする

分類Dev

Djangoクエリセットの最後をループします

分類Dev

Djangoは別のクエリセットのクエリセットからアイテムを除外します

分類Dev

SQLクエリセットをDjangoモデルクエリセットに変換しますか?

分類Dev

Djangoのクエリセットにプロパティを追加する

分類Dev

djangoのクエリセットにフィールドを追加する

Related 関連記事

  1. 1

    Djangoクエリセットを効率的に使用する方法

  2. 2

    Djangoでクエリセットの順序を逆にする

  3. 3

    django-リストをクエリセットに戻す

  4. 4

    Django RestFrameworkのModelViewSetのクエリセットを変更する

  5. 5

    Djangoのクエリセットを理解する際の問題

  6. 6

    Django:クエリセットにデータを追加する

  7. 7

    Djangoクエリセットを逆にする方法

  8. 8

    2つのDjangoクエリセットを結合する

  9. 9

    別のdictでDjangoクエリセットを注文する

  10. 10

    クエリセットデータを別のクエリdjangoに渡す

  11. 11

    Django:クエリセットを注文していくつかのアイテムをクエリセットの最後に移動する方法

  12. 12

    あるクエリセットを別のクエリセットから除外するDjango

  13. 13

    Django 1.11:クラスを使用してクエリセットをcsvにエクスポートする

  14. 14

    Djangoクエリセット:クエリセットの2番目の値を出力する方法は?

  15. 15

    Djangoのモデルクエリセットでself.request.userを使用する

  16. 16

    Django:ListViewを使用してクエリセットに最後に追加された日付を追加する方法

  17. 17

    Django annotate + SUMすべてのエントリを取得する方法

  18. 18

    djangoのクエリセットでサブクエリする方法は?

  19. 19

    'pk'を使用したModelFormのDjangoクエリセット

  20. 20

    Djangoクエリセットはクエリで空の値を取得します

  21. 21

    Django / PythonでManyToManyクエリセットに参加する方法

  22. 22

    djangoクエリセットで使用する属性フィールドのエイリアスを作成する

  23. 23

    Djangoのget_queryset()でクエリセットを返す方法

  24. 24

    クエリの前に自動コミットを変更し、クエリの後にリセットする

  25. 25

    Djangoクエリセットの最後をループします

  26. 26

    Djangoは別のクエリセットのクエリセットからアイテムを除外します

  27. 27

    SQLクエリセットをDjangoモデルクエリセットに変換しますか?

  28. 28

    Djangoのクエリセットにプロパティを追加する

  29. 29

    djangoのクエリセットにフィールドを追加する

ホットタグ

アーカイブ