Джанго запросы и специфическая сортировка
Я совершенно новичок в 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 ....')