Другой способ может существовать, но самое простое (и большинство агрегированных баз данных) решение, которое я знаю, было бы использовать case
statement в предложении order by
.
Первый, настроить whens
Dict для сазе, получая кортеж вы использовали для создания столбца Enum
:
enums = Task.priority.type.enums # finds the Enum tuple (with the same order you originally gave it)
whens = {priority: index for index, priority in enumerate(enums)} # dynamically creates whens dict based on the order of the Enum tuple
Или, если необходимо, жесткий код вашего whens
Dict (определенно меньше чем идеал, так как теперь вы должны изменить код в двух местах):
whens = {'low': 0, 'medium': 1, 'high': 2}
Второй, настроить SOR т логик в случае утверждения:
sort_logic = case(value=Task.priority, whens=whens).label("priority")
Третьего, запустить запрос и заказ по вашему сазу:
q = session.query(Task).order_by(sort_logic) # see the sql at the end of this answer
Вы теперь запрос отсортированы по исходному Enum
кортежу:
>>> for item in q:
print item.id, item.priority
# now in the order you were looking for
4 low
7 low
3 medium
8 medium
2 high
6 high
Для справки, приведенный выше запрос производит следующий SQL:
SELECT tasks.id AS tasks_id,
tasks.summary AS tasks_summary,
tasks.priority AS tasks_priority
FROM tasks
ORDER BY CASE tasks.priority
WHEN :param_1 THEN :param_2
WHEN :param_3 THEN :param_4
WHEN :param_5 THEN :param_6
END
Какую базу данных вы используете под обложками? –
postgres, но предпочтительным является агностическое решение базы данных. – Jon