Агрегация Джанго и следование внешним ключевым отношениям - PullRequest
3 голосов
/ 12 декабря 2011

Модели:

class Item(models.Model):
    name = models.CharField(max_length=100)
    # More stuff.
class Sale(models.Model):
    sale_date = models.DateField(auto_now_add=True)
    item = models.ForeignKey(Item)
    # More stuff.

Просмотр:

class TodaySales(ListView):
    # Stuff in here.
    def get_queryset(self):
        sales_today = Sale.objects.filter(sale_date=date.today())
        return sales_today.values('item').annotate(Count('item'))

Я получаю что-то вроде этого:

[{'item': 1, 'item__count': 2}, {'item': 2, 'item__count': 1}]

Это хорошо, и все, но то, что ядействительно хочу иметь возможность получить дополнительную информацию об элементе, такую ​​как его имя и т. д. Но я не могу сделать это легко, поскольку все, что я получаю, это идентификатор элемента, поэтому я не могу в своем шаблоне сделать,например, {{item.name}}.

Есть ли хороший способ сделать это?

Ответы [ 2 ]

6 голосов
/ 12 декабря 2011

Это подойдет.Попробуйте:

Item.objects.filter(
    sale__sale_date=date.today()
).annotate(
    count = Count('sale')
)
3 голосов
/ 12 декабря 2011

Поскольку вы хотите получать дополнительные данные из Предмета, а не из Продажи, вы можете запросить этот класс:

models.Item.objects.filter(sale__sale_date=date.today()).annotate(Count('id'))

Возвращает объекты ORM, а не values или values_list: у вас также будет синтетический атрибут id__count, доступный с количеством продаж для данного конкретного элемента.

В качестве альтернативы, если вы заранее знаете, какие именно поля вам нужны, вы также можете явно назвать их в своем вызове values, например ::

sales_today.values('item', 'item__name').annotate(Count('item'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...