これは非常に愚かなことですが、Djangoの集計関数と注釈関数を理解していないようです。
非常に単純なモデルのセットがあります:Events
、、。イベントには、とを指す外部キーがあります。単純に、任意のエリアの今後のイベントの数と、すべてのタイプの同じ数、つまり、Area1〜5の今後のイベント、Area2〜6、またはType1〜34のイベントなどを取得したいと思います。Areas
Types
Area
Type
カスタムSQLと、可能であればq演算子の記述は避けたいと思います。
特定の領域について:
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
1つのエリアのイベントの総数だけが必要な場合は、annotate
またはaggregate
のどちらも必要ありません。簡単count
に実行できます。
Event.objects.filter(area=my_area).count()
複数の領域のイベントの数が必要な場合は、以下annotate
と組み合わせて使用する必要がありvalues
ます。
Event.objects.values('area').annotate(Count('area'))
どうもありがとうございました。私が抱えていた問題は、前回のバージョンで文書化されています。それは、注釈とフィルターの優先順位に関するものです。
areas = Area.objects.filter(event__in = eventQuery).annotate(num=Count('event'))
私のエラーは、最初に注釈を付け、次にフィルターを実行していたという事実にありました。
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}]>