Аннотация Django: получение объекта из значений аннотации вместо идентификатора - PullRequest
1 голос
/ 10 марта 2011

Я новичок в аннотациях Django и пытаюсь создать сводный отчет о доходах от ордеров в указанных местоположениях.

Например, отчет будет выглядеть примерно так:

Location Name | Location Type | Sum of Order Subtotal 

А вот примеры моделей, которые я бы использовал:

class Order(models.Model):
    order_subtotal = models.DecimalField(...)
    location = models.ForignKey('Location')
    ....

class Location(models.Model):
    name = models.CharField(...)
    type = models.IntegerField(...)
    ....

Я могу выполнить несколько запросов для аннотирования ...

from django.db import models

In [1]: order_locations =\
    Order.objects.values('location').annotate(models.Sum('order_subtotal'))

In [2]: order_locations[0]
Out[2]: {'location': 1, 'order_subtotal__sum': Decimal('1768.08')}

In [3]: location = order_locations[0]['location']

In [4]: location
Out[4]: 1

In [5]: type(location)
Out[5]: <type 'int'>

Однако строка выше возвращаетint, а не объект Location.Я хотел бы иметь возможность каким-либо образом ссылаться на имя местоположения и тип местоположения, например location.name или location.type.Есть ли способ вернуть объект местоположения в аннотации, а не только идентификатор местоположения (требующий отдельного потенциально дорогого поиска)?

Любой совет очень ценится.

Спасибо, Джо

1 Ответ

2 голосов
/ 10 марта 2011

Рассчитать сумму order_subtotal для каждого местоположения:

>>> locations = Location.objects.all().annotate(total=Sum('order__order_subtotal'))
>>> [(loc.name, loc.typ, loc.total) for loc in locations]
[(u'A', 1, Decimal('10.00')),
 (u'B', 1, Decimal('20.00')),
 ...]

Рассчитать сумму order_subtotal для каждого типа местоположения:

>>> Location.objects.all().values('type').annotate(total=Sum('order__order_subtotal'))
[{'total': Decimal('70.00'), 'typ': 1}, {'total': Decimal('179.00'), 'typ': 2}]

Рассчитать сумму для каждого местоположения, но нене включают заказы старше 14 дней ::

>>> starting_date = datetime.datetime.now() - datetime.timedelta(14)
>>> locations = Location.objects.filter(order__date_gte=starting_date) \
                                .annotate(total=Sum('order__order_subtotal'))

Также обратите внимание на: ПОРЯДОК аннотирования () И фильтра () CLAUSES в django docs.

...