Вопрос

Этот вопрос относится к агрегации / аннотации Django в 1.1.Предположим, у меня есть простая модель с целочисленным полем, которому передан параметр "choices".В этом случае он сопоставляется с кортежем GENDERS, как показано на рисунке.Обычно в шаблоне (или представлении) Я могу ссылаться на текстовое значение gender, используя функцию 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, каждая из записей которого является словарем, а не объектом-Подписчиком.Очевидно, что у этого 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top