請求可能をBooleanFIeldに設定すると、より簡単になります(そして、すべての人にとってより良いでしょう)(https://docs.djangoproject.com/en/dev/ref/models/fields/#booleanfieldを参照)。CharFieldの場合、デフォルトの形式はテキスト入力ボックスです。boolフィールドの場合、これはチェックマークです。ユーザーにとってより意味があります。YまたはNを使用する必要があることを人々に説明するのではなく。
また、モデルには主キーがありません。将来、ユーザーごとのビュー定義に必要になる可能性があります。userid = models.AutoField(primary_key=True)
あなたに大きな手間を省くことができます。
主キーがあれば、将来的に重複したユーザー名と混同される可能性も回避できます。たとえば、以下の私のソリューションでは、同じ名前の2人の異なるユーザーがいる場合、john.smithを1人のユーザーとしてカウントします(unique = Trueを追加しない限り、モデルでは現在これが許可されています)。
例えば。
class InvoiceEntry(models.Model):
username = models.CharField(max_length=20) <-- the users name
billtime = models.DecimalField() <-- how much time has been spent
billable = models.BooleanField() # Now you just use consistent True or False
個人的には、このようなタスクのために、私は自分の辞書を生成するだけです。元のモデルを使用します。
q = InvoiceEntry.objects.all() # only call it once
results = []
users = q.values_list('username',flat=True)
for user in users
dict = {
"user": user,
"unbillable":sum(q.filter(username = user,billable="N").values_list('billtime',flat=True)),
"billable":sum(q.filter(username = user,billable="Y").values_list('billable',flat=True)),
}
results.append(dict)
フィールドをブール値に変更することをお勧めします。
q = InvoiceEntry.objects.all() # only call it once
results = []
users = q.values_list('username',flat=True)
for user in users
dict = {
"user": user,
"unbillable":sum(q.filter(username = user,billable=False).values_list('billtime',flat=True)),
"billable":sum(q.filter(username = user,billable=True).values_list('billtime',flat=True)),
}
results.append(dict)
したがって、ビューなどでrender_to_reponseを使用している場合、テンプレートは次のようになります。
{% for result in results %}
{{ result.user }}
{{ result.unbillable }}
{{ result.billable }}
{% endfor %}