Django聚合获取_ * _显示函数用法

时间:2009-12-10 08:32:58

标签: django aggregation annotations displaytag

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

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

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

models.py

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

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

views.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 %} 
...

1 个答案:

答案 0 :(得分:3)

问题不在于聚合,而在于您正在使用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>