web-dev-qa-db-ja.com

django集計または注釈

これは非常に愚かなことだと思いますが、Django集合体のハンドルを取得して関数に注釈を付けているようには見えません。

私は非常にシンプルなモデルのセットを持っています:EventsAreasおよびTypes。イベントには、AreaおよびTypeを指す外部キーがあります。私は単に、任意のエリアの今後のイベントの数を、すべてのタイプ、つまりArea1-5の今後のイベントArea2-6、またはType1-34イベントなど。

カスタムSQLと、可能であればq演算子の記述を避けたいのですが。

15
freethrow

指定されたエリア:

my_area = Area.objects.all()[0]
Event.objects.filter(area=my_area).count()

注釈

events = Event.objects.annotate(Count('area'))
for event in events:
    print event, event.area__count

または

events = Event.objects.annotate(count=Count('area'))
for event in events:
    print event, event.count

次のドキュメントを参照してください。

https://docs.djangoproject.com/en/dev/ref/models/querysets/#annotate

16
c4urself

1つのエリアのイベントの総数だけが必要な場合は、annotateaggregateも必要ありません。単純なcountで実行できます。

Event.objects.filter(area=my_area).count()

複数のエリアのイベントの数が必要な場合は、annotateとともにvaluesが必要です。

Event.objects.values('area').annotate(Count('area'))
16
Daniel Roseman

どうもありがとうございました。私が抱えていた問題は、前のバージョンで文書化されています。それは、注釈とフィルターの優先順位に関するものです。

areas = Area.objects.filter(event__in = eventQuery).annotate(num=Count('event'))

私のエラーは、最初に注釈を付け、次にフィルターをかけるという事実にありました。

1
freethrow

モデルのイベントとエリアを次のように与えます:

from Django.db.models import Count

class Area(models.Model):
    area_name = models.CharField(...)
    address = models.CharField(...)


class Event(models.Model):
    event_name = models.CharField(...)
    area = models.ForeignKey(Area,...)

各エリアのイベントの総数を取得するには、次のようにします。

area_query = Area.objects.filter(yourfilter)
total_event_per_area = Event.objects.filter(area__in=area_query).values('area').annotate(Count('id'))
print(total_event_per_area)
<QuerySet [{'area': 2, 'id__count': 2}, {'area': 4, 'id__count': 3}]>
0
7guyo