0

django では、次のモデル (少し簡略化されています) が与えられているため、グループの合計を含むビューを取得する方法を見つけるのに苦労しています


    class Client(models.Model):
        api_key = models.CharField(unique=True, max_length=250, primary_key=True)
        name = models.CharField(unique=True, max_length=250)

    class Purchase(models.Model):
        purchase_date = models.DateTimeField()
        client = models.ForeignKey(SavedClient, to_field='api_key')
        amount_to_invoice = models.FloatField(null=True)

特定の月について、たとえば


April 2010

For Each Client that purchased this month:
*   CLient:  Name
*   Total amount of Purchases for this month
*   Total cost of purchases for this month

 For each Purchase made by client:
  * Date
  * Amount
  * Etc

私はdjangoアノテーションを調べてきましたが、特定の月に特定のグループのフィールドの値を合計し、その情報を変数/タグとしてテンプレートに送信する方法を理解できません。

どんな情報でもいただければ幸いです

4

2 に答える 2

2

注釈の代わりに集計を使用できます: http://docs.djangoproject.com/en/dev/topics/db/aggregation/#topics-db-aggregation

Client メソッドを追加すると便利な場合があります。

class Client(models.Model):
    api_key = models.CharField(unique=True, max_length=250, primary_key=True)
    name = models.CharField(unique=True, max_length=250)

    def get_purchases_month(self, y, m):
        return self.purchase_set.filter(purchase_date__year=y, purchase_date__month=m).aggregate(purchase_sum=Sum("amount_to_invoice"))

そこからパラメーターを渡す方法がないため、テンプレートから直接使用することはできません。少なくとも一部のビュー (たとえば、www.domain.com/yourview/2010/03/) では使いやすいでしょう。

于 2010-04-02T14:22:13.677 に答える
1
y, m = 2010, 10
clients = []
for c in Client.objects.all():
  clients.append({'client':c, 'purchases':c.get_purchases_month(y, m)})

そして、リストをテンプレートに渡しclients、そこでループします。それはあまり効果的な方法ではありませんが、単純です;-)

{% for c in clients %}
  {{c.client.name}}
  {{c.purchases_month.purchase_sum}}
  {{c.purchases_month.all|length}}
{% endfor %}

purchases_month.allこれはクエリセットであり、アイテムを取得するにはall()を使用し、これらのアイテムをカウントするには `|length'を使用する必要があるためです。

(コメント内のコードは明らかにフォーマットできないため、別の答えとして入力する必要がありました)

于 2010-04-03T18:48:41.127 に答える