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
字段是CharField
和choices
。这将产生一个字典列表,其中包含 status
DB 值及其计数。
有没有办法聚合status
并显示其显示值?我查看了_get_FIELD_display
的代码,我可能可以效仿,但重复框架的内部代码感觉有点骇人听闻。
【问题讨论】:
你能用输入更新你的问题 -> 预期的输出示例吗? @Germano 问题还不够清楚吗?status
-> status
与其显示值聚合
我的错,我错过了状态有选择。
【参考方案1】:
如果不编写 SQL,您可能无法在 DB 级别轻松实现这一点。但是,由于get_FOO_display
在Model
级别上运行,您甚至不必破解_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 聚合的主要内容,如果未能解决你的问题,请参考以下文章