2010-05-14 60 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标记是否嵌套好(没有尝试过)。另外,如果你有很多数据,我不知道重新组合表现如何,但是总是有缓存...

如果你决定使用这个,请确保你注意到这个顺序在重组文档中提到了这个问题。