此问题涉及Django的聚合/注释在1.1。假设我有与具有传递给它一个“选择”参数的IntegerField一个简单的模型。在这种情况下,将其映射到元组的性别,如图所示。通常,在模板(或视图)我可以通过使用get_gender_display()函数指的是两性的文本值。

然而,当我注释性别计数如我在下面的视图做,我不能然后查找使用get_gender_display()函数中的每个性别的文本值。请参阅下面的模板摘录。我怎么会去获取文本值的性别了?

我从来没有使用Django的聚合前,所以也许我缺少一个明显的解决方案。感谢您考虑我的情况。

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 %} 
...
有帮助吗?

解决方案

问题是不是聚合,这是您正在使用values()。这将返回一个ValuesQuerySet,它的每个条目是一本字典 - 不是一个用户对象。显然,字典不具有任何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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top