Django obtenir l'agrégation _ * _ affichage utilisation de la fonction
-
18-09-2019 - |
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 %}
...
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>