17

これは非常に愚かなことですが、Djangoの集計関数と注釈関数を理解していないようです。

非常に単純なモデルのセットがあります:Events、、。イベントには、とを指す外部キーがあります。単純に、任意のエリアの今後のイベントの数と、すべてのタイプの同じ数、つまり、Area1〜5の今後のイベントArea2〜6、またはType1〜34のイベントなどを取得したいと思います。AreasTypesAreaType

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

4

4 に答える 4

22

特定の領域について:

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

于 2012-01-05T13:59:27.077 に答える
19

1つのエリアのイベントの総数だけが必要な場合は、annotateまたはaggregateのどちらも必要ありません。簡単countに実行できます。

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

複数の領域のイベントの数が必要な場合は、以下annotateと組み合わせて使用​​する必要がありvaluesます。

Event.objects.values('area').annotate(Count('area'))
于 2012-01-05T13:58:29.847 に答える
3

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

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

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

于 2012-01-06T16:31:02.753 に答える
0

モデルのイベントとエリアを次のように指定します。

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}]>
于 2019-09-11T08:56:47.477 に答える