Джанго: Суммирование значений записей, сгруппированных по внешнему ключу - PullRequest
0 голосов
/ 02 апреля 2010

В 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, но не могу понять, как суммировать значения поля для определенной группы за определенный месяц и отправить информацию в шаблон в виде переменной / тега.

Любая информация будет оценена

Ответы [ 2 ]

2 голосов
/ 02 апреля 2010

Вы можете использовать агрегат вместо аннотации: 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/)

1 голос
/ 03 апреля 2010
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 'для подсчета этих элементов

(пришлось поставить как другой ответ, потому что код в комментарии явно не может быть отформатирован)

...