5

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+')
4

1 に答える 1

4

annotate() 句と filter() 句の順序を参照してください。

Publisher.objects.filter(book__rating__gt=3.0).annotate(num_books=Count('book'))

またはあなたの場合:

Publisher.objects.filter(book__type='nonfiction').annotate(num_books=Count('book'))
于 2012-08-24T05:44:18.013 に答える