Book
Django 聚合文档给出了这个例子,它计算与每个相关的 s的数量,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
是一个带有直通表的 Entity M2M 字段,type_id 也是 Entity 中的一个字段:
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+')