Django 集計のドキュメントでは、Book
それぞれに関連するの数をカウントし、Publisher
本の数で注釈が付けられた上位 5 つの出版社を含むクエリ セットを返す次の例を示します (この数で新しいフィールドを追加するなど)。
>>> pubs = Publisher.objects.annotate(num_books=Count('book')).order_by('-num_books')[:5]
>>> pubs[0].num_books
1323
しかし、特定の種類の本だけを数える必要があります。何かのようなもの。
>>> pubs = Publisher.objects.annotate(num_books=Count('book__type="nonfiction"')).order_by('-num_books')[:5]
これを達成するために使用できるフィルターはありますか、それとも生の SQL に頼る必要がありますか?
上記は、システムと病院の両方がヘルスケアとしてモデル化されている場合に、システム内の病院の数によって最大の医療グループを特定して定量化するという私の実際の問題に類似したドキュメントの例ですEntity
。
>>> biggest_systems = Entity.objects.filter(relationships__type_id=NAME_TO_TYPE_ID.get('hospital')).annotate(num_hospitals=Count('relationships')).order_by('-num_hospitals')[:5]
>>> biggest_systems[0].num_hospitals
25
relationships
はスルー テーブルを持つエンティティ M2M フィールドであり、type_id はエンティティ内のフィールドでもあります。
class Entity(models.Model):
id = models.AutoField(verbose_name='ID',primary_key=True, db_column='ID')
type_id = models.IntegerField(verbose_name='detailed type',db_column='TypeID', blank=True, editable=True, choices=ENTITYTYPE_CHOICES, help_text="A category for this healthcare entity.")
relationships = models.ManyToManyField('self', verbose_name='affiliated with', through='EntityRelationship', symmetrical=False, related_name='related_to+')