Джанго запросы и специфическая сортировка

Я совершенно новичок в Django, и это способ выполнения запросов. Я думаю, что я получил основы сейчас, но я застрял в проблеме сортировки.

Итак, скажем, у меня есть этот пример модели:

class Word_List(models.Model):
  list_name = models.CharField(max_length=64)
  number_of_words = models.IntegerField(default=0)

У меня есть несколько данных:

pk      list_name      number_of_words

1       vegetables     30
2       fruits         5
3       animals        7
4       objects        15
5       instruments    16
6       fruits         28

Теперь я хочу, чтобы они были отсортированы по number_of_words, а затем сгруппированы по list_name, причем верхний список является важным в группировке. Здесь более четкое объяснение с отсортированными элементами, которые я имею в виду:

pk      list_name      number_of_words

1       vegetables     30
6       fruits         28
2       fruits         5
5       instruments    16
4       objects        15
3       animals        7

Я перепробовал несколько вещей, но так и не достиг того, чего хотел. Я начал с этого:

sorted_lists = Word_List.objects.all().order_by('-number_of_words')

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

sorted_lists = Word_List.objects.all().order_by('list_name', -'number_of_words')

И в итоге с этим результатом:

pk      list_name      number_of_words

3       animals        7    
6       fruits         28
2       fruits         5
5       instruments    16
4       objects        15
1       vegetables     30

Ааа, и я застрял, я думаю о том, чтобы выполнить сортировку после запроса с использованием базового Python и мульти-циклов или, может быть, как-то с несколькими запросами, а затем объединить результаты, но я чувствую, что может быть чистое и красивое решение.

Благодарю.

1 ответ

Решение

Простой способ достижения этого:

query = Word_List.objects.all().query
query.group_by = ['-list_name']
query.order_by = ['-number_of_words']
sorted_list = QuerySet(query=query, model=Word_List)

Обратите внимание, что это может быть изменено в будущей версии Django, поскольку это не задокументировано. Используйте безопасные SQL-запросы, чтобы быть в безопасности:

Word_List.objects.raw('SELECT * FROM appname_Word_List ORDER_BY ....')
Другие вопросы по тегам