[解決済み] Djangoでカウントアノテーションのためにオブジェクトをフィルタリングする方法は?
質問
シンプルなDjangoのモデルを考える
Event
と
Participant
:
class Event(models.Model):
title = models.CharField(max_length=100)
class Participant(models.Model):
event = models.ForeignKey(Event, db_index=True)
is_paid = models.BooleanField(default=False, db_index=True)
イベントクエリに参加者総数を簡単にアノテートできます。
events = Event.objects.all().annotate(participants=models.Count('participant'))
でフィルタリングされた参加者数をアノテーションするには?
is_paid=True
?
クエリを実行する必要があります
すべてのイベント
参加者の数に関係なく、例えば、注釈付きの結果でフィルタリングする必要はない。もし
0
の参加者がいればそれでいい。
0
をアノテーション値で指定します。
は
ドキュメントからの例
でアノテーションするのではなく、クエリからオブジェクトを除外してしまうからです。
0
.
更新しました。 Django 1.8では、新たに 条件式機能 で、こんなことができるようになりました。
events = Event.objects.all().annotate(paid_participants=models.Sum(
models.Case(
models.When(participant__is_paid=True, then=1),
default=0,
output_field=models.IntegerField()
)))
アップデート2 Django 2.0では、新たに 条件付き集計 を参照してください。 受け付けた答え の下にあります。
アップデート3. Django 3.x 用にお願いします。 以下の回答をご覧ください。 .
解決方法は?
条件付き集計
Django 2.0 では、今までの手間をさらに減らすことができます。また、これは Postgres の
filter
ロジックは、sum-caseよりもいくらか高速です(20-30%という数字が飛び交っているのを見たことがあります)。
とにかく、あなたの場合、次のような単純なものを見ています。
from django.db.models import Q, Count
events = Event.objects.annotate(
paid_participants=Count('participants', filter=Q(participants__is_paid=True))
)
については、ドキュメントに別のセクションがあります。 アノテーションのフィルタリング . 条件付き集計と同じようなものですが、上の例のような感じです。いずれにせよ、これは私が以前にやっていた厄介なサブクエリよりもずっと健全なものです。
関連
-
python string splicing.join()とsplitting.split()の説明
-
Python 可視化 big_screen ライブラリ サンプル 詳細
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】Djangoのクエリセットフィルタリングでnot equalを行うにはどうすればよいですか?
-
[解決済み] リスト項目の出現回数を数えるにはどうしたらいいですか?
-
[解決済み] Pandas DataFrameの行数を取得する方法は?
-
[解決済み] Djangoでクエリオブジェクトを日付範囲でフィルタリングするにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonショートビデオクローラーチュートリアル
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み】IndexError: invalid index to scalar variableを修正する方法
-
[解決済み】Flask ImportError: Flask という名前のモジュールがない