Порядок набора запросов обрабатывается серверной частью базы данных, а не Django. Это ограничивает возможности изменения способа упорядочения. Вы можете либо загрузить все данные и отсортировать их с помощью Python, либо добавить в свой запрос дополнительные параметры, чтобы база данных использовала какую-то пользовательскую сортировку, определив функции.
Используйте набор запросов extra( ) позволит вам делать то, что вы хотите, выполняя пользовательский SQL для сортировки, но за счет снижения переносимости.
В вашем примере, вероятно, было бы достаточно разделить поле ввода на два набора данных: начальный символ и оставшееся целочисленное значение. Затем вы можете применить сортировку к обоим столбцам. Вот пример (непроверенный):
qs = MyModel.objects.all()
# Add in a couple of extra SELECT columns, pulling apart this_field into
# this_field_a (the character portion) and this_field_b (the integer portion).
qs = qs.extra(select={
'this_field_a': "SUBSTR(this_field, 1)",
'this_field_b': "CAST(substr(this_field, 2) AS UNSIGNED)"})
Вызов extra
добавляет два новых поля в вызов SELECT
. Первое предложение извлекает первый символ поля, второе предложение преобразует оставшуюся часть поля в целое число.
Теперь должно быть возможно order_by
в этих полях. При указании двух полей для order_by
порядок сначала применяется к символьному полю, а затем к целочисленному полю.
eg
qs = qs.order_by('this_field_a', 'this_field_b')
Этот пример должен работать как на MySql, так и на SQLite. Также должна быть возможность создать одно дополнительное поле, которое используется только для сортировки, что позволит вам указать только одно поле в вызове order_by()
.
person
Austin Phillips
schedule
18.03.2013