首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >注释中的params为什么和如何相互影响?

注释中的params为什么和如何相互影响?
EN

Stack Overflow用户
提问于 2018-01-09 22:02:16
回答 1查看 34关注 0票数 0

我已经读了很多https://docs.djangoproject.com/en/1.11/topics/db/aggregation/,但是我仍然遗漏了一些东西。

使用Django 1.11,假设我有以下模型:

代码语言:javascript
复制
class School(models.Model):
    pass

class Classroom(models.Model):
    school = models.ForeignKey(School, on_delete=models.PROTECT)
    active = models.BooleanField()
    busy = models.BooleanField()

class Chalkboard(models.Model):
    classroom = models.ForeignKey(Classroom, on_delete=models.PROTECT)

class Whiteboard(models.Model):
    classroom = models.ForeignKey(Classroom, on_delete=models.PROTECT)

我创建了一所学校,有一个教室,有两个白板和两个黑板:

代码语言:javascript
复制
s = School()
s.save()

c = Classroom(school=s, active=True, busy=False)
c.save()

Chalkboard(classroom=c).save()
Chalkboard(classroom=c).save()

Whiteboard(classroom=c).save()
Whiteboard(classroom=c).save()
Whiteboard(classroom=c).save()

我想要一个总结,有多少黑板在每所学校是积极的,但不忙。

代码语言:javascript
复制
q = School.objects.filter(
    Q(classroom__active=True) & Q(classroom__busy=False)
).annotate(
    chalkboard_count=Count('classroom__chalkboard'),
)

q[0].chalkboard_count
2                        # as expected

现在我想知道黑板和白板。

代码语言:javascript
复制
q = School.objects.filter(
    Q(classroom__active=True) & Q(classroom__busy=False)
).annotate(
    chalkboard_count=Count('classroom__chalkboard'),
    whiteboard_count=Count('classroom__whiteboard'), # added this line
)

q[0].chalkboard_count
6                        # expected 2
q[0].whiteboard_count
6                        # expected 3

如果我将调用链接到注释,就会得到相同的结果。

代码语言:javascript
复制
q = School.objects.filter(
    Q(classroom__active=True) & Q(classroom__busy=False)
).annotate(
    chalkboard_count=Count('classroom__chalkboard')
).annotate(
    whiteboard_count=Count('classroom__whiteboard')
)

q[0].chalkboard_count
6                        # expected 2
q[0].whiteboard_count
6                        # expected 3

一直以来,这些数字都是我所期望的

代码语言:javascript
复制
Chalkboard.objects.count()
2
Whiteboard.objects.count()
3

我在这里做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-10 00:08:20

从你发布的链接中:

组合多个聚合 将多个聚合与注解()组合在一起会产生错误的结果,因为使用的是联接而不是子查询:对于大多数聚合来说,没有办法避免这个问题,然而,Count聚合有一个不同的参数,可能有助于:

代码语言:javascript
复制
Book.objects.annotate(
    Count('authors', distinct=True), 
    Count('store', distinct=True)
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48177300

复制
相关文章

相似问题

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