Django得到每个年龄段的计数
我有这个模型:Django得到每个年龄段的计数,django,orm,Django,Orm,我有这个模型: class User_Data(AbstractUser): date_of_birth = models.DateField(null=True,blank=True) city = models.CharField(max_length=255,default='',null=True,blank=True) address = models.TextField(default='',null=True,blank=True) gender =
class User_Data(AbstractUser):
date_of_birth = models.DateField(null=True,blank=True)
city = models.CharField(max_length=255,default='',null=True,blank=True)
address = models.TextField(default='',null=True,blank=True)
gender = models.TextField(default='',null=True,blank=True)
我需要运行一个django查询来获得每个年龄的计数。大概是这样的:
Age || Count
10 || 100
11 || 50
and so on.....
有几种方法可以做到这一点。最近我不得不做一些非常类似的事情。这个例子适用于Postgres 注意:我已经按照我的方式编写了下面的代码,这样它在语法上可以正常工作,并且可以在每个步骤之间进行编写。但是如果你愿意的话,你可以把它们连在一起 首先,我们需要对queryset进行注释,以获得“age”参数。由于它不是存储为整数,并且可以每天更改,因此我们可以使用数据库的“当前_日期”函数从出生日期字段计算它:
ud=User\u Data.objects.annotate(
age=RawSQL(“”(日期部分('year',current日期)–日期部分('year',“app\u userdata.”出生日期”)::整数“”,[]),
)
注意:您需要更改“app_userdata”部分以与模型的表匹配。你可以从模型的meta中选择它,但这取决于你是否想让它便携。如果需要,请使用string.format()将其替换为模型的_meta提供的内容。如果你不在乎,就把表名放在那里
现在,我们从中选择“年龄”值,这样我们就可以得到一个仅包含此字段的ValuesQuerySet
ud=ud.values('age'))
然后用年龄计数对查询集进行注释
ud=ud.annotate(
计数=计数(“年龄”),
)
此时,我们有了一个ValuesQuerySet,其中包含“age”和“count”字段。订购时要以合理的方式进行
ud=ud.order\u by('age'))
就在这里
您必须按此顺序建立查询集,否则将得到一些有趣的结果。即;您不能将所有注释分组在一起,因为count的第二个注释取决于第一个注释,而且kwargs dict不知道kwargs的定义顺序,因此当queryset执行字段/依赖项检查时,它将失败
希望这有帮助
如果您不使用Postgres,您唯一需要更改的就是RawSQL注释,以匹配您正在使用的任何数据库引擎。但是,该引擎可以从字段或其内置的“当前日期”函数中获取日期的年份。如果您可以将其作为整数获取,则其工作方式将完全相同。以下是我对lambda所做的操作:
usersAge = map(lambda x: calculate_age(x[0]), User_Data.objects.values_list('date_of_birth'))
users_age_data_source = [[x, usersAge.count(x)] for x in set(usersAge)]
users_age_data_source = sorted(users_age_data_source, key=itemgetter(0))
感谢您的帮助,我对lambda
usersAge=map(lambda x:calculate_age(x[0]),User_Data.objects.values_list('date_of_birth'))用户_age_Data_source=[x,usersAge.count(x)]用户_age_Data_source=sorted(users_age_Data_Data_source,key=itemgitter(0))