Django build get _ * _ use display function

This question relates to Django aggregation / annotation in 1.1. Suppose I have a simple model with IntegerField that has a β€œselect” parameter passed to it. In this case, it maps to the GENDERS tuple, as shown. Usually in a template (or view) I can refer to the textual gender value using the get_gender_display () function.

However, when I annotate gender calculations, as I do in the presentation below, I cannot then search for a text value for each gender using the get_gender_display () function. See Template Excerpt below. How can I get a text value for gender?

I have never used Django aggregation before, so maybe I am missing an obvious solution. Thank you for considering my 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 %} ... 
+4
source share
1 answer

The problem is not aggregation, but that you are using values() . This returns a ValuesQuerySet, each of which is a dictionary, not a Subscriber object. Obviously this dict has no get_FOO_display methods.

The quickest solution is to use a custom filter:

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

and in the template:

 <div>{{ genderAndsum.gender|gender_lookup }} {{ genderAndsum.gender_sum }}</div> 
+3
source

All Articles