タグ付けされた質問 「django-aggregation」

5
Djangoでcountアノテーションのオブジェクトをフィルタリングする方法は?
単純な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() ))) Update 2. Django 2.0には新しい条件付き集約機能があります。以下の承認済みの回答を参照してください。

7
Django:日付でグループ化(日、月、年)
私はこのような単純なモデルを持っています: class Order(models.Model): created = model.DateTimeField(auto_now_add=True) total = models.IntegerField() # monetary value そして、私は月ごとの内訳を出力したいと思います: 1か月の販売数(COUNT) 合計値(SUM) これを攻撃する最善の方法は何なのかわかりません。私はかなり怖そうな余分な選択クエリをいくつか見ましたが、私の単純な心は、任意の開始年/月から始まり、現在の月に到達するまでカウントアップして単純な数字を捨てて、数字を繰り返すだけの方がいいかもしれないと言っていますその月のフィルタリングクエリ。より多くのデータベース作業-開発者のストレスを軽減! あなたにとって最も意味のあるものは何ですか?データの簡単な表をプルバックできる良い方法はありますか?それとも私の汚い方法はおそらく最良のアイデアですか? 私はDjango 1.3を使用しています。彼らがGROUP_BY最近より良い方法を追加したかどうかはわかりません。

2
Djangoでグループ化して集約する方法
ORMを介して作成したい非常に単純なクエリがありますが、それを理解できません。 私は3つのモデルを持っています: 場所(場所)、属性(場所が持つ可能性のある属性)、および評価(スコアフィールドも含むM2M 'から'モデル) いくつかの重要な属性を選択し、それらの属性によって自分の場所をランク付けできるようにしたい-つまり、選択したすべての属性よりも合計スコアが高い=より良い。 次のSQLを使用して、必要なものを取得できます。 select location_id, sum(score) from locations_rating where attribute_id in (1,2,3) group by location_id order by sum desc; 戻る location_id | sum -------------+----- 21 | 12 3 | 11 ORMで取得できる最も近いものは次のとおりです。 Rating.objects.filter( attribute__in=attributes).annotate( acount=Count('location')).aggregate(Sum('score')) どちらが戻る {'score__sum': 23} つまり、場所ごとにグループ化されていない、すべての合計です。 これを回避する方法はありますか?SQLを手動で実行することもできますが、一貫性を保つためにORMを使用したいと思います。 ありがとう
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.