Фильтр 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. Вы можете поменять их местами, если хотите, чтобы приоритет отдавался статусу бронирования.