Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.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
Django得到每个年龄段的计数_Django_Orm - Fatal编程技术网

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))