Создайте строку, которая перечисляет количество типов объектов в наборе запросов - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь создать строку, которая выводит итоги для каждого типа элемента в наборе запросов для следующей модели.

class Booking(models.Model):

    _JACKET_SIZES = (
        ('s', 'Small'),
        ('m', 'Medium'),
        ('l', 'Large'),
        ('xl', 'X Large'),
        ('xxl', '2X Large'),
        ('unknown', 'Unsure'),
    )

    ...
    jacket_size = models.CharField(max_length=7, choices=_JACKET_SIZES, default='small', null=True)
    ...

По сути, я пытаюсь сопоставить список размеров пиджака в строку. Это то, что я уже пытался, но я уверен, что есть более простой способ.

bookings = Booking.objects.all()

jackets = {}
for booking in bookings:
    jackets.setdefault(booking.get_jacket_size_display(), jackets.get(booking_get_jacket_size_display(), 0) + 1)

o = ', '.join('{}: {}'.format(k,v) for k,v in jackets.items()])

Предположим, что набор запросов содержит 4 объекта. 1 маленький жакет, 2 средних жакета и 1 большой жакет.

Результат приведенного выше кода, по-видимому, дает только 1 Medium, а не 2, как если бы он игнорировал вторую среднюю оболочку.

1 Ответ

0 голосов
/ 31 октября 2018

Вы можете сделать это, выполнив .annotate(..):

from django.db.models import Count

Booking.objects.values('jacket_size').annotate(
    number=Count('id')
).order_by('jacket_size')

Это даст QuerySet, который содержит словари, такие как:

<QuerySet [
    {'jacket_size': 'l', 'number': 12},
    {'jacket_size': 'm', 'number': 25},
    {'jacket_size': 's', 'number': 31},
    {'jacket_size': 'unknown', 'number': 17},
    {'jacket_size': 'xl', 'number': 9},
    {'jacket_size': 'xxl', 'number': 7},
]>

Некоторые замечания:

  1. jacket_size s, для которых нет Booking, не будет отображаться в базе данных, поскольку база данных не знает, что эти размеры существуют, и, таким образом, вы можете захотеть «исправить» данные (путем преобразования его в список или словарь и добавления отсутствующих записей);
  2. .order_by(..) необходимо заставить GROUP BY.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...