我有这个型号:
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.....
答案 0 :(得分:1)
以下是我对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))
答案 1 :(得分:0)
有几种方法可以做到这一点。我最近不得不做一些非常相似的事情。这个例子适用于Postgres。
注意:我已经按照我的方式编写了以下代码,因此语法上它可以正常工作,因此我可以在每一步之间编写代码。但如果你愿意的话,你可以将它们连在一起。
首先,我们需要注释查询集以获取' age'参数。由于它没有存储为整数,并且每天都可以更改,因此我们可以使用数据库的“current_date”来计算出生日期。功能:
ud = User_Data.objects.annotate(
age=RawSQL("""(DATE_PART('year', current_date) - DATE_PART('year', "app_userdata"."date_of_birth"))::integer""", []),
)
注意:您需要更改" app_userdata"部分与您的模型表匹配。你可以从模特的_meta中选择这个,但这取决于你是否想让它变得便携。如果这样做,请使用字符串.format()将其替换为模型的_meta提供的内容。如果您不关心这一点,只需将表名放在那里。
现在我们选择' age'为了得到一个只有这个字段
的ValuesQuerySet,我们得到了值ud = ud.values('age')
然后使用年龄计数注释该查询集
ud = ud.annotate(
count=Count('age'),
)
此时我们有一个ValuesQuerySet,它同时具有' age'和'计算'作为领域。订购它以便以合理的方式出现..
ud = ud.order_by('age')
你有它。
您必须按此顺序构建查询集,否则您将获得一些有趣的结果。即;你不能将所有注释组合在一起,因为第二个注释取决于第一个,并且因为kwargs dict没有关于kwargs定义的顺序的概念,当查询集进行字段/依赖性检查时,它会失败。
希望这有帮助。
如果您没有使用Postgres,那么您唯一需要更改的是RawSQL注释,以匹配您正在使用的任何数据库引擎。然而,该引擎可以从一个字段或其内置的"当前日期"来获得日期的年份。 function..providing你可以把它作为整数得出,它的工作方式完全一样。