これは非常に愚かなことだと思いますが、Django集合体のハンドルを取得して関数に注釈を付けているようには見えません。
私は非常にシンプルなモデルのセットを持っています:Events
、Areas
およびTypes
。イベントには、Area
およびType
を指す外部キーがあります。私は単に、任意のエリアの今後のイベントの数を、すべてのタイプ、つまりArea1-5の今後のイベント、Area2-6、またはType1-34イベントなど。
カスタム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}]>