Задать вопрос
@aassdds
Люблю борщ и PHP

Как сделать сортировку по choice?

Добрый день
Модель:
TICKET_STATUSES = (
        (OPEN, "OP"),
        (CLOSE, "CL"),
        (DEPRECATED, "DP"),
        (TRASH, "TR"),
    )
    title = models.CharField(max_length=100)
    status = models.CharField(max_length=2, choices=TICKET_STATUSES, default=OPEN)


Вьюшка:

order_sql = '(case when status="OP" then 1 when status="CL" then 2 when status="DR" then 3 end)'
    tickets_set = Tickets.objects.filter(project_id=project_id).extra(select={'status_order': order_sql}, order_by=['status'])


Нужно чтобы был следующий порядок
1 - OP
2 - CL
3 - DP
4 - TR

Но на деле получается что
1 - OP
2 - DP
3 - CL
4 - TR

Подскажите - как надо сделать ?
  • Вопрос задан
  • 174 просмотра
Подписаться 2 Оценить Комментировать
Ответ пользователя sim3x К ответам на вопрос (2)
sim3x
@sim3x
Насколько я понимаю, case в бд отрабатывает уже когда весь запрос сформирован на отдачу и он просто подменяет результат для того чтоб показать его тебе

TICKET_STATUS_OPEN = 1
   TICKET_STATUS_CLOSE = 2
   TICKET_STATUS_DEPRECATED = 3
   TICKET_STATUS_TRASH = 4

   TICKET_STATUSES = (
        (TICKET_STATUS_OPEN, 'OPEN'),
        (TICKET_STATUS_CLOSE, 'CLOSE'),
        (TICKET_STATUS_DEPRECATED, 'DEPRECATED'),
        (TICKET_STATUS_TRASH, 'TRASH'),
    )
    title = models.CharField(max_length=100)
    status = models.PositiveIntegerField(max_length=2, choices=TICKET_STATUSES, default=TICKET_STATUS_OPEN)


Сортировать просто по полю - там ведь просто циферки

Можно сделать хак типа
1_OP
2_CL
3_DP
4_TR

Можно stackoverflow.com/questions/883575/custom-ordering...
Но на обьемах будет медленно, очень медленно
Ответ написан
Комментировать