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

これらのフィールドは変更できません。これらは、既に 20 万行以上を含むテーブルの一部です。

以下を返すクエリセットを作成する必要があります。

  • ユーザー名
  • 請求可能な時間の合計 (ユーザーごと)
  • 請求不能時間の合計 (ユーザーごと)

...たとえば、過去 7 日間 (そのビットは簡単です)。

これを行うための最もきちんとした方法は何ですか?

前もって感謝します - パトリック

4

1 に答える 1

2

請求可能を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 %}
于 2013-03-10T20:28:09.157 に答える