Question

Cette question se rapporte à Django agrégation / Annotation 1.1. Supposons que j'ai un modèle simple avec un IntegerField qui a un paramètre « choix » qui lui est passé. Dans ce cas, il correspond à un tuple SEXES comme indiqué. Normalement, dans un modèle (ou vue) Je peux faire référence à la valeur textuelle du genre en utilisant la fonction get_gender_display ().

Cependant, quand j'annoter les comptes de genre comme moi dans la vue ci-dessous, je ne peux pas alors rechercher la valeur textuelle pour chaque sexe à l'aide de la fonction get_gender_display (). Voir l'extrait de modèle ci-dessous. Comment puis-je obtenir la valeur textuelle pour le genre de retour?

Je ne l'ai jamais utilisé Django d'agrégation avant, donc je suis peut-être manquer une solution évidente. Merci de considérer ma situation.

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 %} 
...
Était-ce utile?

La solution

Le problème n'est pas l'agrégation, il est que vous utilisez values(). Cela renvoie un ValuesQuerySet, dont chacune des entrées est un dictionnaire - pas un objet d'abonné. De toute évidence, que dict n'a pas de méthodes de get_FOO_display.

La solution la plus rapide serait d'utiliser un filtre personnalisé:

from myapp.models import GENDERS

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

et dans le modèle:

<div>{{ genderAndsum.gender|gender_lookup }} {{ genderAndsum.gender_sum }}</div>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top