Я запрашиваю модель:
Members.objects.all()
И это возвращает:
Eric, Salesman, X-Shop
Freddie, Manager, X2-Shop
Teddy, Salesman, X2-Shop
Sean, Manager, X2-Shop
То, что я хочу, это знать лучший способ Django для отправки group_by
запроса в мою базу данных, например:
Members.objects.all().group_by('designation')
Что не работает, конечно. Я знаю, что мы можем сделать некоторые трюки django/db/models/query.py
, но мне просто интересно узнать, как это сделать без исправлений.
python
django
django-models
simplyharsh
источник
источник
Members.objects.filter(date=some_date).values('designation').annotate(dcount=Count('designation'))
Members.objects.order_by('disignation').values('designation').annotate(dcount=Count('designation'))
Простое, но не правильное решение - использовать сырой SQL :
Другое решение заключается в использовании
group_by
свойства:Теперь вы можете перебирать переменную результатов, чтобы получить ваши результаты. Обратите внимание, что
group_by
это не задокументировано и может быть изменено в будущей версии Django.И ... почему вы хотите использовать
group_by
? Если вы не используете агрегацию, вы можете использоватьorder_by
для достижения одинакового результата.источник
Вы также можете использовать
regroup
тег шаблона для группировки по атрибутам. Из документов:Выглядит так:
Это также работает на
QuerySet
s, я верю.источник: https://docs.djangoproject.com/en/2.1/ref/templates/builtins/#regroup
edit: обратите внимание, что
regroup
тег не работает так, как вы ожидаете, если ваш список словарей не отсортирован по ключам. Это работает итеративно. Поэтому сортируйте свой список (или набор запросов) по ключу группировщика, прежде чем передавать его вregroup
тег.источник
Вам нужно сделать пользовательский SQL, как показано в этом фрагменте:
Пользовательский SQL через подзапрос
Или в пользовательском менеджере, как показано в онлайн-документации Django:
Добавление дополнительных методов менеджера
источник
Django не поддерживает свободную группу по запросам . Я узнал это очень плохо. ORM не предназначен для поддержки таких вещей, как то, что вы хотите делать, без использования собственного SQL. Вы ограничены:
cr.execute
предложения (и ручной анализ результата)..annotate()
(группировка по предложениям выполняется в дочерней модели для .annotate (), в таких примерах, как агрегация lines_count = Count ('lines'))).Через набор запросов
qs
вы можете позвонить,qs.query.group_by = ['field1', 'field2', ...]
но это рискованно, если вы не знаете, какой запрос вы редактируете, и у вас нет гарантии, что он будет работать и не нарушит внутреннюю часть объекта QuerySet. Кроме того, это внутренний (недокументированный) API, к которому вы не должны обращаться напрямую, не рискуя тем, что код больше не будет совместим с будущими версиями Django.источник
Существует модуль, который позволяет вам группировать модели Django и по-прежнему работать с QuerySet в результате: https://github.com/kako-nawao/django-group-by
Например:
'Книга / books.html'
Отличие от
annotate
/aggregate
basic запросов Django заключается в использовании атрибутов связанного поля, напримерbook.author.last_name
.Если вам нужны PK экземпляров, которые были сгруппированы вместе, добавьте следующую аннотацию:
ПРИМЕЧАНИЕ:
ArrayAgg
это особая функция Postgres, доступная в Django 1.9 и далее: https://docs.djangoproject.com/en/1.10/ref/contrib/postgres/aggregates/#arrayaggисточник
values
методу. Я думаю, что для другой цели.values
является SQL,select
аgroup_by
является SQLgroup by
(как следует из названия ...). Почему отрицательный голос? Мы используем такой код в производстве для реализации сложныхgroup_by
операторов.group_by
«ведет себя в основном как метод значений, но с одним отличием ...» В документе не упоминается SQL,GROUP BY
а предоставленный сценарий использования не предполагает, что он имеет какое-либо отношение к SQLGROUP BY
. Я откажусь от голосования, когда кто-то прояснил это, но этот документ действительно вводит в заблуждение.values
я обнаружил, что я пропустил, чтоvalues
само по себе работает как GROUP BY. Это моя вина. Я думаю, что его проще использовать,itertools.groupby
чем этот django-group-by, когда этогоvalues
недостаточно.group by
с помощью простогоvalues
вызова - с или безannotate
и без извлечения всего из базы данных. Ваше предложениеitertools.groupby
работает для небольших наборов данных, но не для нескольких тысяч наборов данных, которые вы, вероятно, хотите разместить на странице. Конечно, в этот момент вам придется подумать о специальном поисковом индексе, который в любом случае содержит подготовленные (уже сгруппированные) данные.В документе говорится, что вы можете использовать значения для группировки набора запросов.
Вы можете найти все книги и сгруппировать их по имени, используя этот код:
Вы можете посмотреть некоторые листы здесь .
источник
Если я не ошибаюсь, вы можете использовать любой набор запросов .group_by = [' field ']
источник
сначала нужно импортировать сумму потом ..
источник