Pregunta

Esta pregunta se refiere a Django Agregación / anotación en 1.1. Supongamos que tengo un modelo simple con un IntegerField que tiene un parámetro "opciones" que se le pasa. En este caso, se asigna a una tupla GÉNEROS como se muestra. Normalmente, en una plantilla (o vista) I puede referirse al valor textual del género mediante el uso de la función get_gender_display ().

Sin embargo, cuando anotaciones en el recuento de género como yo en la vista por debajo, no puedo entonces buscar el valor textual para cada género usando la función get_gender_display (). Ver el extracto siguiente plantilla. ¿Cómo hago para obtener el valor de género textual para volver?

Nunca he usado Django agregación antes, así que tal vez me falta una solución obvia. Gracias por pensar en mi situación ti.

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

plantilla

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

Solución

El problema no es la agregación, es que está utilizando values(). Esto devuelve una ValuesQuerySet, cada una de cuyas entradas es un diccionario - no un objeto de suscriptor. Obviamente, que dict no tiene ningún métodos get_FOO_display.

La solución más rápida sería el uso de un filtro personalizado:

from myapp.models import GENDERS

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

y en la plantilla:

<div>{{ genderAndsum.gender|gender_lookup }} {{ genderAndsum.gender_sum }}</div>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top