4

この質問は、1.1 の Django Aggregation/Annotation に関するものです。「choices」パラメーターが渡された IntegerField を持つ単純なモデルがあるとします。この場合、示されているように GENDERS タプルにマップされます。通常、テンプレート (またはビュー) では、get_gender_display() 関数を使用して性別のテキスト値を参照できます。

ただし、以下のビューのように性別カウントに注釈を付けると、get_gender_display() 関数を使用して各性別のテキスト値を検索できません。以下のテンプレートの抜粋を参照してください。性別のテキスト値を取り戻すにはどうすればよいですか?

これまで Django Aggregation を使用したことがないため、明らかな解決策が欠けている可能性があります。私の状況を考慮していただきありがとうございます。

models.py

GENDERS = (
  ('','    '),
  (1,'Female'),
  (2,'Male'),
)

class Subscriber(models.Model):
   gender = models.IntegerField(blank=True, null=True, choices=GENDERS)

ビュー.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)) 

テンプレート

...
{% for genderAndsum in sum_genders %}
  <div>{{ genderAndsum.get_gender_display }} {{ genderAndsum.gender_sum }}</div>
{% endfor %} 
...
4

1 に答える 1

3

問題は集計ではなく、使用していることですvalues()。これは ValuesQuerySet を返します。各エントリはディクショナリであり、Subscriber オブジェクトではありません。get_FOO_display明らかに、その dict にはメソッドがありません。

最も簡単な解決策は、カスタム フィルターを使用することです。

from myapp.models import GENDERS

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

そしてテンプレートで:

<div>{{ genderAndsum.gender|gender_lookup }} {{ genderAndsum.gender_sum }}</div>
于 2009-12-10T09:33:30.247 に答える