Django Grouping Query - PullRequest
       4

Django Grouping Query

2 голосов
/ 14 мая 2010

У меня есть следующие (упрощенные) модели:

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

Ответы [ 2 ]

0 голосов
/ 18 мая 2010

Я понимаю, что вы, вероятно, уже написали свой сырой SQL, но мне пришло в голову следующее, когда я увидел способ отображения ваших данных:

Если вы можете сделать это на уровне шаблона, вы можете стратегически использовать фильтр тегов и длины regroup .

Regroup берет «список похожих объектов», так что набор запросов может работать просто отлично, но в документах показан список словарей, поэтому я использовал значения здесь:

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>

Я не уверен, хорошо ли встраивается тег перегруппировки (не пробовал). Кроме того, я понятия не имею, насколько хорошо выполняет перегруппировка, если у вас много данных, но опять же, всегда есть кеширование ...

Если вы решите использовать это, убедитесь, что вы обратили внимание на порядок, указанный в документах о перегруппировке.

0 голосов
/ 14 мая 2010

Этот пост похож на то, что вы ищете:

Джанго-эквивалент для подсчета и группировки по

В зависимости от версии Django, вы можете или не сможете использовать ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...