Domanda

Questa domanda si riferisce a Django Aggregazione / annotazione in 1.1. Supponiamo che io sono un modello semplice con un'IntegerField che ha un parametro di "scelte" passati ad esso. In questo caso, si associa ad una tupla GENDERS come mostrato. Normalmente, in un modello (o vista) posso fare riferimento al valore testuale del genere utilizzando la funzione get_gender_display ().

Tuttavia, quando ho annotare i conteggi di genere come faccio in vista qui sotto, non posso quindi ricerca il valore testuale per ogni genere utilizzando la funzione get_gender_display (). Vedere l'estratto modello sottostante. Come potrei fare per ottenere il valore testuale per genere indietro?

Non ho mai usato Django aggregazione prima, quindi forse mi manca una soluzione ovvia. Grazie per considerare la mia situazione.

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

modello

...
{% for genderAndsum in sum_genders %}
  <div>{{ genderAndsum.get_gender_display }} {{ genderAndsum.gender_sum }}</div>
{% endfor %} 
...
È stato utile?

Soluzione

Il problema non è l'aggregazione, è che si sta utilizzando values(). Questo restituisce un ValuesQuerySet, ognuno dei quali voci è un dizionario - non un oggetto abbonato. Ovviamente, che dict non ha metodi get_FOO_display.

La soluzione più rapida sarebbe quella di utilizzare un filtro personalizzato:

from myapp.models import GENDERS

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

e nel template:

<div>{{ genderAndsum.gender|gender_lookup }} {{ genderAndsum.gender_sum }}</div>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top