在 Django 中,我如何获得两个以上模型的聚合数据

Posted

技术标签:

【中文标题】在 Django 中,我如何获得两个以上模型的聚合数据【英文标题】:In Django how can i get aggregated data on more than two models 【发布时间】:2013-01-20 23:58:35 【问题描述】:
class Book(models.Model):
    # fields

class Chapter(models.Model):
     book = models.ForeignKey(Book)

class Page(models.Model):
     chapter = models.ForeignKey(Chapter)

如果我想知道特定书籍“A”的页数,实现这一目标的最佳方法是什么?

当然,我可以循环阅读 A 书的章节并将每章的页数相加,但我认为这不是更聪明的方法。

有没有办法通过 ORM / Queryset 做到这一点?某种聚合?

【问题讨论】:

【参考方案1】:

这样的事情可能会奏效:

book_a = Book.objects.get(name='A')
page_count = Page.objects.filter(chapter__book=book_a).count()

这将导致数据库连接,这将返回章节来自 A 书的页数。

【讨论】:

【参考方案2】:

尝试类似:

from django.db.models import Count

page_count = Book.objects.filter(name='A').annotate(Count(chapter__pages))

结果应该在page_count[0].chapter__pages__count 中。查看documentation 了解更多信息。

【讨论】:

以上是关于在 Django 中,我如何获得两个以上模型的聚合数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中预取聚合的@property?

Django聚合:两个字段相乘的总和

带有聚合的 Django 子查询

django聚合多天

在 django 查询集中的两个日期之间有可能获得几个月?

072:Django数据库ORM聚合函数详解-aggregate和annotate