Django - 使用 get_FOO_display 聚合

Posted

技术标签:

【中文标题】Django - 使用 get_FOO_display 聚合【英文标题】:Django - aggregation with get_FOO_display 【发布时间】:2014-09-23 11:57:17 【问题描述】:

考虑以下几点:

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

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

有没有办法聚合status 并显示其显示值?我查看了_get_FIELD_display 的代码,我可能可以效仿,但重复框架的内部代码感觉有点骇人听闻。

【问题讨论】:

你能用输入更新你的问题 -> 预期的输出示例吗? @Germano 问题还不够清楚吗? status -> status 与其显示值聚合 我的错,我错过了状态有选择。 【参考方案1】:

如果不编写 SQL,您可能无法在 DB 级别轻松实现这一点。但是,由于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())

【讨论】:

get_FOO_display 是动态添加的,它不像你说的那样可用,除非你的意思是别的。你能提供一个可行的例子吗? 谢谢,正是我想要的。【参考方案2】:

看看django.contrib.admin.util.display_for_field 函数。你必须找到字段对象:

field = queryset.model._meta.get_field('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'))

【讨论】:

这里的分类是什么?为什么状态不属于值 args,因为它是他试图分组的列?我有兴趣在没有额外的 for 循环的情况下完成此操作。

以上是关于Django - 使用 get_FOO_display 聚合的主要内容,如果未能解决你的问题,请参考以下文章

django使用已有的数据库表怎么建立model

Django web 开发 - Django的使用

Django-下载安装-配置-创建django项目-三板斧简单使用

使用Django返回helloworld

使用Django返回helloworld

使用Django返回helloworld