2011-03-10 40 views
1

我是Django Annotations的新手,我試圖在給定位置生成訂單收入摘要報告。Django Annoation:從Annoation值獲取對象而不是ID

例如,該報告將是這個樣子:

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。有沒有辦法在註解中返回一個位置對象,而不是隻有位置ID(需要單獨的潛在昂貴的查找)?

任何意見是非常感謝。

謝謝, 喬

回答

2

計算的order_subtotal爲每個位置總和:爲每個位置類型的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')), 
...] 

計算總和:

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

還請注意:ORDER OF annotate() AND filter() CLAUSES在django文檔。

+0

很漂亮,謝謝! – 2011-03-10 18:09:52

+0

一個相關的問題。有沒有一種方法可以將過濾器放在作爲註釋一部分進行彙總的訂單上?我知道我的例子不是那麼詳細,但是想知道是否有方法在訂單日期過濾。 – 2011-03-10 18:20:34

+1

是的,你可以把過濾器,我已經更新了我的答案。 – Ski 2011-03-10 18:32:40

相關問題