Как запросить как GROUP BY в django?

Необходим только один вызов jq. Чтобы выделить выходные данные для отдельных файлов, вы можете объединить этот один вызов с одним вызовом для awk или использовать цикл оболочки, как показано ниже.

Во-первых, вот иллюстрация того, как будет выглядеть конвейер оболочки:

jq -r --rawfile dd2name dd2name.tsv -f group.jq input.json |
  while IFS= 

Это предполагает, что отображение имен файлов находится в файле TSV с именем dd2name.tsv, и что следующая программа jq находится в group.jq:

def dict:
  split("\n") | map(select(length>0) | split("\t"))
  | INDEX(.[0]) | map_values(.[1]);

($dd2name | dict) as $dict
| ($dict | keys_unsorted[]) as $dd
| map(select(.dd == $dd))
| group_by(.jlo)
| map("\($dict[$dd])\t\(.[0].jlo) \(length)")[]

Как следует из названия, функция dict создает словарь, дающий сопоставление значений .dd с именами файлов. Предполагается наличие INDEX. Если у вашего jq нет INDEX, то сейчас самое время обновить ваш jq; в противном случае его def можно легко скопировать из buildin.jq (google: builtin.jq "def INDEX"), или вы можете заменить последнюю строку на: | reduce .[] as $p ({}; .[$p[0]] = $p[1]);

решение на основе awk

Вызов awk можно использовать вместо приведенной выше команды while ... done:

awk -F\\t 'fn && (fn!=$1) {close(fn)}; {fn=$1; print $2 >> fn}'

Сезон по вкусу

Если файл отображения dd2name.tsv не содержит суффикс ".txt", он может быть легко добавлен любым из множества способов, в зависимости от вкуса.

Отметим также, что предложенные решения выше делают некоторые предположения, в частности, что значения .jlo не содержат табуляции, новых строк или NUL. Если какое-либо из этих предположений будет нарушено, потребуется некоторая настройка.

\t' read -r f v ; do echo "$v" >> "$f" ; done

Это предполагает, что отображение имен файлов находится в файле TSV с именем dd2name.tsv, и что следующая программа jq находится в group.jq:

def dict:
  split("\n") | map(select(length>0) | split("\t"))
  | INDEX(.[0]) | map_values(.[1]);

($dd2name | dict) as $dict
| ($dict | keys_unsorted[]) as $dd
| map(select(.dd == $dd))
| group_by(.jlo)
| map("\($dict[$dd])\t\(.[0].jlo) \(length)")[]

Как следует из названия, функция dict создает словарь, дающий сопоставление значений .dd с именами файлов. Предполагается наличие INDEX. Если у вашего jq нет INDEX, то сейчас самое время обновить ваш jq; в противном случае его def можно легко скопировать из buildin.jq (google: builtin.jq "def INDEX"), или вы можете заменить последнюю строку на: | reduce .[] as $p ({}; .[$p[0]] = $p[1]);

решение на основе awk

Вызов awk можно использовать вместо приведенной выше команды while ... done:

awk -F\\t 'fn && (fn!=$1) {close(fn)}; {fn=$1; print $2 >> fn}'

Сезон по вкусу

Если файл отображения dd2name.tsv не содержит суффикс ".txt", он может быть легко добавлен любым из множества способов, в зависимости от вкуса.

Отметим также, что предложенные решения выше делают некоторые предположения, в частности, что значения .jlo не содержат табуляции, новых строк или NUL. Если какое-либо из этих предположений будет нарушено, потребуется некоторая настройка.

303
задан daaawx 24 March 2019 в 08:34
поделиться

3 ответа

Если Вы означаете делать агрегирование, можно использовать функции агрегирования ORM:

from django.db.models import Count
Members.objects.values('designation').annotate(dcount=Count('designation'))

Это приводит к запросу, подобному

SELECT designation, COUNT(designation) AS dcount
FROM members GROUP BY designation

, и вывод имел бы форму

[{'designation': 'Salesman', 'dcount': 2}, 
 {'designation': 'Manager', 'dcount': 2}]
446
ответ дан jb. 23 November 2019 в 01:23
поделиться

Легкое решение, но не надлежащий путь состоит в том, чтобы использовать необработанный SQL:

results = Members.objects.raw('SELECT * FROM myapp_members GROUP BY designation')

Другое решение состоит в том, чтобы использовать group_by свойство:

query = Members.objects.all().query
query.group_by = ['designation']
results = QuerySet(query=query, model=Members)

можно теперь выполнить итерации по переменной результатов для получения результатов. Обратите внимание, что group_by не документируется и может быть изменен в будущей версии Django.

И... почему Вы хотите использовать group_by? Если Вы не используете агрегирование, можно использовать order_by для достижения подобного результат.

49
ответ дан 3 revs, 3 users 82% 23 November 2019 в 01:23
поделиться

Необходимо сделать пользовательский SQL, как иллюстрируется этим отрывком:

Пользовательский SQL через подзапрос

Или в пользовательском менеджере как показано в документах Django онлайн:

Добавляющие дополнительные методы менеджера

6
ответ дан Van Gale 23 November 2019 в 01:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: