【问题标题】:Django - aggregation with get_FOO_displayDjango - 使用 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 与其显示值聚合
  • 我的错,我错过了状态有选择。

标签: django django-orm django-aggregation


【解决方案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 循环的情况下完成此操作。
猜你喜欢
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 2012-01-15
  • 2010-12-20
  • 1970-01-01
相关资源
最近更新 更多