2

我有一个看起来有点像这样的模型:

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)
...

这些字段无法更改 - 它们是已包含 200k+ 行的表的一部分。

我需要创建一个返回的查询集:

  • 用户名
  • 计费时间总和(每个用户)
  • 不可计费时间的总和(每个用户)

...比如说,过去 7 天(这很容易)。

最简洁的方法是什么?

在此先感谢 - 帕特里克

4

1 回答 1

2

如果您将 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 %}
于 2013-03-10T20:28:09.157 回答