@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

Подскажите - как надо сделать ?
  • Вопрос задан
  • 173 просмотра
Пригласить эксперта
Ответы на вопрос 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...
Но на обьемах будет медленно, очень медленно
Ответ написан
Комментировать
Вкратце алгоритм такой, как расписал @sim3x
но можно сделать еще и так
Добавить еще одну модель для хранения статусов и необходимого порядка сортировки. Можно построить гуишку, чтобы пользователь менял сам как ему необходимо или админ.
в модель с полем статус добавить числовое поле, указывающее порядок сортировки
на модели ловить сигнал pre_save и добавлять из таблицы порядок сортировки.
проводить сортировку по новому полю.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы