Django - упорядочить по полю, если оно не равно нулю, затем использовать другое - PullRequest
1 голос
/ 05 марта 2020

Допустим, у меня есть следующая модель:

class MyModel(models.Model):
    name = models.CharField(max_length=255)
    date_1 = models.DateField(null=True, blank=True)
    date_2 = models.DateField(null=True, blank=True)

В каждой модели будет хотя бы одно из полей даты. То, что я хочу сделать, это заказать по следующему - если модель имеет date_1, заказать его по date_1. Если у него нет date_1, закажите его по date_2. Делая что-то вроде этого:

MyModel.objects.all().order_by('date_1', 'date_2')

прикрепит все нулевые значения date_1 к концу. Принимая во внимание, что я хотел бы иметь «чередование». Например, я хотел бы получить следующий вывод (в формате json):

[
   {"id": 1, "date_1": "2020-02-01", "date_2": null},
   {"id": 4, "date_1": null, "date_2": 2020-02-02},           # orders by date_2 as there is no date_1
   {"id": 2, "date_1": "2020-02-03", "date_2": "2020-02-01"}, # orders by date_1, ignores date_2
   {"id": 3, "date_1": "2020-02-04", "date_2": null},
]

Возможно ли это сделать с django ORM?

1 Ответ

2 голосов
/ 05 марта 2020

Вы можете сделать аннотацию с выражением Coalesce [Django -doc] , а затем заказать в этом поле:

from django.db.models.functions import Coalesce

MyModel.objects.annotate(
    <b>date=Coalesce('date1', 'date2')</b>
).order_by(<b>'date'</b>)

или даже короче: вы можете заказать по Coalesce напрямую:

from django.db.models.functions import Coalesce

MyModel.objects.order_by(<b>Coalesce('date1', 'date2').asc()</b>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...