2010-05-14 39 views
2

我有以下的(簡化)型號:Django的分組查詢

class Donation(models.Model): 
    entry_date = models.DateTimeField() 

class Category(models.Model): 
    name = models.CharField() 

class Item(models.Model): 
    donation = models.ForeignKey(Donation) 
    category = models.ForeignKey(Category) 

我想顯示的項目總數,每個類別由捐贈一年分組。

我已經試過這樣:

Donation.objects.extra(select={'year': "django_date_trunc('year', 
    %s.entry_date)" % Donation._meta.db_table}).values('year', 
    'item__category__name').annotate(items=Sum('item__quantity')) 

但我得到item__category__name一個字段錯誤。

我也試過:

Item.objects.extra(select={"year": "django_date_trunc('year', 
    entry_date)"}, tables=["donations_donation"]).values("year", 
    "category__name").annotate(items=Sum("quantity")).order_by() 

一般讓我我想要的東西,但該項目的數量計數被捐贈記錄的數量成倍增加。

任何想法?基本上我想顯示此:

 
2010 
    - Category 1: 10 items 
    - Category 2: 17 items 

2009 
    - Category 1: 5 items 
    - Category 3: 8 items 

回答

0

這等後看起來像你要找的東西:

Django equivalent for count and group by

根據您的Django的版本,你可能會或可能無法使用它雖然。

+0

我在Django 1.1.1 - 應該提到這一點。我可以做「按類別劃分的項目」查詢,並在該主題中進一步回答,但我無法弄清楚該如何做的是在三個模型中進行 - 每個類別的項目按捐贈日期分組。這是我失去的第三個組成部分。 – Matt 2010-05-14 12:39:08

+0

@matt django查詢的目的是靈活的,但有時候你根本無法使用django查詢來完成工作。在這種情況下,你可能會考慮使用直接的sql解決方案。在這一點上它可能會更具可讀性。 http://docs.djangoproject.com/zh/dev/topics/db/sql/#topics-db-sql – dlamotte 2010-05-14 12:46:05

+0

我很害怕這個。現在找出這個查詢的原始SQL;) – Matt 2010-05-14 13:23:24

0

我知道你可能已經寫你的原始SQL,但是當我看到你想要的方式來顯示數據下面就來記:

如果這是正常的在模板級別,你可能做到這一點能夠策略性地使用regroup標籤和長度過濾器。

重組採用「相似的對象名單」,讓一個QuerySet可能工作得很好,但該文檔顯示字典列表,所以我在這裏使用的值:在模板

item_listing = Item.objects.values('category__name', 'donation__entry_date') 
# use your favourite method to extract the year information into a key in item_listing 
item_listing = ... 

現在,像這樣:

<ul> 
{% for year_group in item_listing %} 
    <li>{{ year_group.grouper }} 
    <ul> 
     {% regroup year_group.list by category__name as category_listing %} 
     {% for category_group in category_listing %} 
     <li> 
     Category: {{ category_group.grouper }} 
     Count: {{ category_group.list|length }} 
     </li> 
     {% endfor %} 
    </ul> 
    </li> 
{% endfor %} 
</ul> 

我不確定regroup標記是否嵌套好(沒有嘗試過)。另外,如果你有很多數據,我不知道重新組合表現如何,但是總是有緩存...

如果你決定使用這個,請確保你注意到這個順序在重組文檔中提到了這個問題。