Фильтр ordery_by не работает должным образом в django

data = models.Booking.objects.filter(center__isnull=False,org_type='homedx').order_by('-created_at')

return data.order_by( Case( 
                   When ( booking_status="resampling", then=Value(0) ),
                   When ( booking_status="sample not received", then=Value(1)  ),
                   default = Value(1)
                      )
                )

created_at - это поле DateTimeField в модели Booking Model. Здесь я упорядочил по полю выбора и для этого я использовал методы Case, When и Value из django.db.models. Но когда я использую этот метод, он игнорирует order_by created_at. Я имею в виду, когда эти два условия выполнены. Я хочу получить данные в порядке последней даты. Почему это не работает? Спасибо!!!

Поскольку теперь у вас есть два .order_by(…) положения, и как указано в документации .order_by(…):

Каждый вызов order_by() будет очищать любое предыдущее упорядочивание. Например, этот запрос будет упорядочен по pub_date, а не по заголовку:

Entry.objects.order_by('headline').order_by('pub_date')

Вы можете добавить два поля в предложение .order_by(…), так:

return models.Booking.objects.filter(center__isnull=False,org_type='homedx').order_by(
    '-created_at',        # 🖘 first field
    Case(                 # 🖘 second field
       When(booking_status='resampling', then=Value(0)),
       default=Value(1)
    ).asc()
)

Таким образом, сначала будет произведена сортировка по полю created_at, а в случае tie порядок по booking_status. Вы можете поменять их местами, если хотите, чтобы приоритет отдавался статусу бронирования.

Вернуться на верх