Указание порядка сортировки модели, связанной с Django
-
13-09-2019 - |
Вопрос
У меня есть модели Django, представляющие собой списки элементов, и я хочу, чтобы элементы в каждом списке имели отдельный порядок сортировки.Возможно, список 1 будет сортировать позиции по названию, список 2 — по дате, а список 3 — по приоритету.
Модели выглядят примерно так:
class ListItem(models.Model):
priority = models.IntegerField(choices=PRIORITY_CHOICES)
name = models.CharField(max_length=240)
due_date = models.DateTimeField(null=True, blank=True)
list = models.ForeignKey(List)
Прямо сейчас я использую этот запрос, на мой взгляд:
lists = List.objects.filter(user=request.user)
return render_to_response('showlists.html', {'lists': lists })
Я читал примеры, которые подразумевают, что я мог бы сделать что-то вроде этого:
lists = List.objects.filter(user=request.user).select_related().order_by("items.name")
Если это сработает, я получу коллекцию списков с одинаковым порядком сортировки для каждой партии элементов.Как мне по-разному сортировать связанные элементы каждого отдельного списка?
Решение
Синтаксис упорядочивания связанных моделей аналогичен формату двойного подчеркивания, что и для filter
, поэтому вы можете сделать:
List.objects.filter(user=request.user).select_related().order_by("listitems__name")
Вы должны просто иметь возможность использовать разные поля одинаково в order_by
вызов.
Другие советы
Если списки небольшие, то вы можете сделай это на питоне, используя сортировку и тегирование
list = <...code to get sublist here ...>
list.sort(key=lambda x: x.due_date) #sort by due date, say
В противном случае запустите запрос для каждого подсписка.