从django queryset中的单个字段派生多个值
我有一个模型看起来有点像这样:从django queryset中的单个字段派生多个值,django,django-queryset,Django,Django Queryset,我有一个模型看起来有点像这样: class InvoiceEntry(models.Model): ... username = models.CharField(max_length=20) <-- the users name billtime = models.DecimalField() <-- how much time has been spent billable = models.CharField(max_le
class InvoiceEntry(models.Model):
...
username = models.CharField(max_length=20) <-- the users name
billtime = models.DecimalField() <-- how much time has been spent
billable = models.CharField(max_length=1) <-- is this work billable? (Y or N)
...
类发票条目(models.Model):
...
username=models.CharField(max_length=20)如果您将billable设置为BooleanFIeld(请参阅:),则会更容易(对您来说也更好)。对于CharField,默认表单是一个文本输入框,对于bool字段,它是一个复选标记-对用户来说更有意义!而不是向人们解释他们必须使用Y或N
此外,您的模型没有主键。您将来可能需要它来定义每个用户的视图userid=models.AutoField(primary\u 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=False).values_list('billtime',flat=True)),
"billable":sum(q.filter(username = user,billable=True).values_list('billtime',flat=True)),
}
results.append(dict)
现在,如果您在视图中使用render_to_response或类似的方法,则您的模板将如下所示:
{% for result in results %}
{{ result.user }}
{{ result.unbillable }}
{{ result.billable }}
{% endfor %}
感谢您对模型的建议,它更像是一个示例(真实的模型非常广泛,包含主键等-并且它是第三方数据库的一部分-因此无法更改)。这在数据库上似乎非常密集-尽管这似乎是一条路要走。现在正在测试。这似乎比只返回全部总和的查询集要长20倍。也许您可以尝试使用注释或聚合。
{% for result in results %}
{{ result.user }}
{{ result.unbillable }}
{{ result.billable }}
{% endfor %}