Django聚合get_*_display函数用法

标签 django aggregation annotations displaytag

这个问题与 1.1 中的 Django 聚合/注释有关。假设我有一个带有传递给它的“选择”参数的 IntegerField 的简单模型。在这种情况下,它映射到一个 GENDERS 元组,如图所示。通常,在模板(或 View )中,我可以使用 get_gender_display() 函数来引用性别的文本值。

但是,当我在下面的 View 中注释性别计数时,我无法使用 get_gender_display() 函数查找每个性别的文本值。请参阅下面的模板摘录。我将如何恢复性别的文本值?

我以前从未使用过 Django Aggregation,所以也许我错过了一个明显的解决方案。谢谢你考虑我的情况。

模型.py

GENDERS = (
  ('','    '),
  (1,'Female'),
  (2,'Male'),
)

class Subscriber(models.Model):
   gender = models.IntegerField(blank=True, null=True, choices=GENDERS)

View .py
from django.db.models import Count

def myview(request):
... 
    sum_gender = Subscriber.objects.values('gender').annotate(gender_sum=Count('gender')) 
    context = { 'sum_gender':sum_gender, }
    return render_to_response(template_name, context,context_instance=RequestContext(request)) 

模板
...
{% for genderAndsum in sum_genders %}
  <div>{{ genderAndsum.get_gender_display }} {{ genderAndsum.gender_sum }}</div>
{% endfor %} 
...

最佳答案

问题不在于聚合,而在于您使用的是 values() .这将返回一个 ValuesQuerySet,其中的每个条目都是一个字典 - 而不是 Subscriber 对象。显然,该 dict 没有任何 get_FOO_display方法。

最快的解决方案是使用自定义过滤器:

from myapp.models import GENDERS

@register.filter
def gender_lookup(value)
    gender_dict = dict(GENDERS)
    return gender_dict.get(value, '')

并在模板中:
<div>{{ genderAndsum.gender|gender_lookup }} {{ genderAndsum.gender_sum }}</div>

关于Django聚合get_*_display函数用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1879497/

相关文章:

python - CSS样式我的django表

python - 为什么我需要 DJANGO_SETTINGS_MODULE 集?

elasticsearch - Elasticsearch术语聚合会跳过一些条目

language-agnostic - 更喜欢组合而不是继承?

java - 时钟接龙游戏/聚合

java - 如何在没有 @Override 注释的情况下找到所有覆盖父类(super class)/接口(interface)方法的方法?

python - django InspectDB 'unique_together' 指的是不存在的字段

python - 在局域网系统中访问django项目

routes - 路由中的区域设置,无参数的默认语言

java - 从 Maven 插件扫描自定义注释类