Pergunta

Esta questão refere-se a Django Agregação / anotação em 1.1. Suponha que eu tenho um modelo simples com uma IntegerField que tem um parâmetro "escolhas" passado para ele. Neste caso, ele mapeia para uma tupla GÊNEROS como mostrado. Normalmente, num molde (ou vista) que pode referir-se o valor textual do género, utilizando a função get_gender_display ().

No entanto, quando eu anotar as contagens de gênero como eu faço na vista abaixo, eu não posso, em seguida, procurar o valor textual para cada sexo utilizando a função get_gender_display (). Veja o trecho modelo abaixo. Como eu iria sobre como obter o valor textual para trás gênero?

Eu nunca usei Django Agregação antes, então talvez eu estou sentindo falta de uma solução óbvia. Obrigado por considerar a minha situação.

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)) 

template

...
{% for genderAndsum in sum_genders %}
  <div>{{ genderAndsum.get_gender_display }} {{ genderAndsum.gender_sum }}</div>
{% endfor %} 
...
Foi útil?

Solução

O problema não é a agregação, é que você está usando values(). Isso retorna uma ValuesQuerySet, cada um de cujas entradas é um dicionário - não é um objeto assinante. Obviamente, que dict não tem nenhum métodos get_FOO_display.

A solução mais rápida seria a utilização de um filtro personalizado:

from myapp.models import GENDERS

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

e no modelo:

<div>{{ genderAndsum.gender|gender_lookup }} {{ genderAndsum.gender_sum }}</div>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top