Django得到每个年龄的计数

时间:2017-08-22 16:00:24

标签: 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 = models.TextField(default='',null=True,blank=True)

我需要运行一个django查询来获取每个年龄的计数。像这样:

Age || Count
10  ||  100
11  ||  50
and so on.....

2 个答案:

答案 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你可以把它作为整数得出,它的工作方式完全一样。