Django,捆绑在一起计数查询?
Django, bundle together count queries?
假设我有关系
class Person(models.Model):
is_asian = models.BooleanField()
is_male = models.BooleanField()
is_gay = models.BooleanField()
last_name = models.ForeignKey('FamilyName')
is_happy = models.BooleanField()
class FamilyName(models.Model):
title = models.CharField(max_length=200, primary_key=True)
目前,当我想获得大量关于我的人口的统计数据时,我会这样做
have_x_many_males = Person.objects.filter(is_male=True).count()
have_x_many_gays = Person.objects.filter(is_gay=True).count()
have_x_many_roberts = Person.objects.filter(last_name_id='robert').count()
...
但是,如果我的统计数据数量增加,这将非常低效
有没有办法将查询全部捆绑在一起并立即执行它们并返回一个列表或其他东西?
>>> main_query = [query_1, query_2, query_3]
>>> main_query.execute()
{'have_x_many_males':5, ...}
class Person(models.Model):
is_asian = models.BooleanField()
is_male = models.BooleanField()
is_gay = models.BooleanField()
last_name = models.ForeignKey('FamilyName')
is_happy = models.BooleanField()
def get_count(self):
return{
'have_x_many_males': Person.objects.filter(is_male=True).count()
'have_x_many_gays': Person.objects.filter(is_gay=True).count()
'have_x_many_robertss': Person.objects.filter(last_name_id='robert').count()
}
然后p = Person.objects.all().get_count()
from django.db import models
aggregates = {
'have_x_many_males': models.Sum(models.Case(models.When(is_male=True, then=1), output_field = models.IntegerField())),
'have_x_many_roberts': models.Sum(models.Case(models.When(last_name_id='robert', then=1), output_field = models.IntegerField())),
}
queryset = Person.objects.all().annotate(**aggregates)
假设我有关系
class Person(models.Model):
is_asian = models.BooleanField()
is_male = models.BooleanField()
is_gay = models.BooleanField()
last_name = models.ForeignKey('FamilyName')
is_happy = models.BooleanField()
class FamilyName(models.Model):
title = models.CharField(max_length=200, primary_key=True)
目前,当我想获得大量关于我的人口的统计数据时,我会这样做
have_x_many_males = Person.objects.filter(is_male=True).count()
have_x_many_gays = Person.objects.filter(is_gay=True).count()
have_x_many_roberts = Person.objects.filter(last_name_id='robert').count()
...
但是,如果我的统计数据数量增加,这将非常低效
有没有办法将查询全部捆绑在一起并立即执行它们并返回一个列表或其他东西?
>>> main_query = [query_1, query_2, query_3]
>>> main_query.execute()
{'have_x_many_males':5, ...}
class Person(models.Model):
is_asian = models.BooleanField()
is_male = models.BooleanField()
is_gay = models.BooleanField()
last_name = models.ForeignKey('FamilyName')
is_happy = models.BooleanField()
def get_count(self):
return{
'have_x_many_males': Person.objects.filter(is_male=True).count()
'have_x_many_gays': Person.objects.filter(is_gay=True).count()
'have_x_many_robertss': Person.objects.filter(last_name_id='robert').count()
}
然后p = Person.objects.all().get_count()
from django.db import models
aggregates = {
'have_x_many_males': models.Sum(models.Case(models.When(is_male=True, then=1), output_field = models.IntegerField())),
'have_x_many_roberts': models.Sum(models.Case(models.When(last_name_id='robert', then=1), output_field = models.IntegerField())),
}
queryset = Person.objects.all().annotate(**aggregates)