Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从django queryset中的单个字段派生多个值_Django_Django Queryset - Fatal编程技术网

从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 %}