Frage

Diese Frage bezieht sich auf Django Aggregation / Annotation in 1.1. Angenommen, ich ein einfaches Modell mit einem Integer haben, die eine „Auswahl“ Parameter hat an sie übergeben. In diesem Fall ordnet sie einen Genders Tupel, wie dargestellt. Normalerweise kann ich auf den Textwert des Geschlechts bezieht sich in einer Vorlage (oder Ansicht) durch die get_gender_display () Funktion.

Allerdings, wenn ich die Geschlechter zählt mit Anmerkungen versehen, wie ich unten in der Ansicht tun, kann ich nicht dann Nachschlag den Textwert für jedes Geschlecht die get_gender_display () Funktion. Siehe die Vorlage Auszug unten. Wie würde ich mich über den Textwert für Geschlecht zurück zu bekommen?

Ich habe Django Aggregation noch nie benutzt, also vielleicht eine offensichtliche Lösung, die ich bin fehlt. Vielen Dank für meine Situation betrachten.

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 %} 
...
War es hilfreich?

Lösung

Das Problem ist nicht die Aggregation, dann ist es, dass Sie values() verwenden. Dies gibt eine ValuesQuerySet, die jeweils deren Einträge ein Wörterbuch - kein Subscriber-Objekt. Offensichtlich ist, dass das dict keine get_FOO_display Methoden haben.

Die schnellste Lösung wäre, einen benutzerdefinierten Filter zu verwenden:

from myapp.models import GENDERS

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

und in der Vorlage:

<div>{{ genderAndsum.gender|gender_lookup }} {{ genderAndsum.gender_sum }}</div>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top