如果您将 billable 设置为 BooleanFIeld(请参阅:https ://docs.djangoproject.com/en/dev/ref/models/fields/#booleanfield),将会更容易(并且对您来说更好)。对于 CharField,默认表单是文本输入框,对于 bool 字段,它是复选标记 - 对用户更有意义!而不是向人们解释他们必须使用 Y 或 N。
此外,您的模型没有主键。将来您可能需要它用于每个用户的视图定义。userid = models.AutoField(primary_key=True)
可以为您省去很多麻烦。
如果您有主键,您也可以避免将来与重复的用户名混淆。例如,如果有两个不同的用户同名,我下面的解决方案会将 john.smith 计为一个用户(您的模型目前允许这样做,除非您添加 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 %}