Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 注释中的参数为什么以及如何相互影响?_Python_Django_Aggregate Functions - Fatal编程技术网

Python 注释中的参数为什么以及如何相互影响?

Python 注释中的参数为什么以及如何相互影响?,python,django,aggregate-functions,Python,Django,Aggregate Functions,我一直在读很多书,但我还是错过了一些东西 使用Django 1.11,假设我有以下模型: class School(models.Model): pass class Classroom(models.Model): school = models.ForeignKey(School, on_delete=models.PROTECT) active = models.BooleanField() busy = models.BooleanField() cl

我一直在读很多书,但我还是错过了一些东西

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

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)
我创建了一个学校,有一个教室,有两块白板和两块黑板:

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()
我想总结一下每所学校有多少黑板是活跃的,但并不繁忙

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
现在我想知道黑板和白板

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
如果我将调用链接到annotate,我会得到相同的结果

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
一直以来,计数都是我所期望的

Chalkboard.objects.count()
2
Whiteboard.objects.count()
3

我做错了什么?

来自您发布的链接:

组合多个聚合 将多个聚合与annotate()组合将产生错误的结果 由于使用联接而不是子查询而导致的结果: 但是,对于大多数骨料,无法避免此问题, 计数聚合有一个独特的参数,可以帮助:


它就在我面前,我错过了。谢谢!
Book.objects.annotate(
    Count('authors', distinct=True), 
    Count('store', distinct=True)
)