Django - 使用get_FOO_display进行聚合

时间:2014-07-31 13:49:47

标签: django django-orm django-aggregation

请考虑以下事项:

status = queryset.values('status').annotate(count=Count('status'))

其中status字段是CharField choices。这将生成一个字典列表,其中包含status DB值及其计数。

有没有办法汇总status并显示其显示值?我查了_get_FIELD_display的代码,我可能会仿效,但重复框架的内部代码感觉有些不自在。

2 个答案:

答案 0 :(得分:2)

如果不破解SQL,您可能无法轻松地在数据库级别实现此目的。但是,由于get_FOO_displayModel级别上运行,您甚至不必手动修改_get_FIELD_display或查找选项(如果以下方法不会使您的服务器花费太多) :

YourModel(status=status).get_status_display()

因此

for s in queryset.values('status').annotate(count=Count('status')):
    print(queryset.model(status=s['status']).get_status_display())

答案 1 :(得分:0)

查看django.contrib.admin.util.display_for_field功能。你必须找到字段对象:

field = next(field for field in queryset.model._meta.fields
             if field.name == 'status')

然后您可以将其用作:

display_for_field(status, field)

或者,在您的情况下:

{ unicode(display_for_field(t['status'], field)): t['count']
    for t in queryset.values('taxonomy').annotate(count=models.Count('taxonomy'))}