首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Django中,是否有一种方法可以聚合具有相关对象上的条件的关系

在Django中,是否有一种方法可以聚合具有相关对象上的条件的关系
EN

Stack Overflow用户
提问于 2012-08-24 11:42:16
回答 1查看 974关注 0票数 5

Django聚合文档给出了这个例子,它计算了与每个Publisher相关的Book的数量,并返回一个带有前5个出版商的查询集,其中标注了它们的图书计数(比如用这个计数追加一个新字段):

代码语言:javascript
复制
>>> pubs = Publisher.objects.annotate(num_books=Count('book')).order_by('-num_books')[:5]
>>> pubs[0].num_books
1323

但我只需要计算一种特定类型的书。就像这样。

代码语言:javascript
复制
>>> pubs = Publisher.objects.annotate(num_books=Count('book__type="nonfiction"')).order_by('-num_books')[:5]

有没有过滤器可以用来实现这一点,或者我需要求助于原始SQL?

上面的文档示例类似于我的实际问题,即通过系统中的医院数量来识别和量化最大的医疗集团,当系统和医院都被建模为医疗保健Entity时:

代码语言:javascript
复制
>>> 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也是Entity中的一个字段:

代码语言:javascript
复制
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+')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-24 13:44:18

请参阅Order of annotate() and filter() clauses

代码语言:javascript
复制
Publisher.objects.filter(book__rating__gt=3.0).annotate(num_books=Count('book'))

或者在你的例子中:

代码语言:javascript
复制
Publisher.objects.filter(book__type='nonfiction').annotate(num_books=Count('book'))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12102843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档