Почему nulls_last = False не ставит нули на первое место в Django? - PullRequest
0 голосов
/ 10 марта 2020

Я считаю, что пока nulls_last=True работает, nulls_last=False - нет. Пример ниже в Django оболочке.

In [10]: [x.date for x in Model.objects.all().order_by(F('date').asc(nulls_last=True))]                                                                                                                               
Out[10]: 

[datetime.datetime(2020, 3, 10, 16, 58, 7, 768401, tzinfo=<UTC>),
 datetime.datetime(2020, 3, 10, 17, 4, 51, 601980, tzinfo=<UTC>),
 None,
 ]

[ins] In [11]: [x.last_run_created_at for x in Model.objects.all().order_by(F('date').asc(nulls_last=False))]                                                                                                                              
Out[11]: 
[datetime.datetime(2020, 3, 10, 16, 58, 7, 768401, tzinfo=<UTC>),
 datetime.datetime(2020, 3, 10, 17, 4, 51, 601980, tzinfo=<UTC>),
 None,
 ]

In [12]:                                                                                              

Я пробовал это как с desc(), так и с asc().

1 Ответ

0 голосов
/ 10 марта 2020

Ошибка в предположении, что противоположность nulls_last=True равна nulls_last=False. Это не так.

nulls_last=True делает с запросом следующее:

SELECT ... ORDER BY ... ASC NULLS LAST

, тогда как nulls_last=False просто означает использование базы данных по умолчанию:

SELECT ... ORDER BY ... ASC

Вместо этого вам нужно использовать nulls_first=True ИЛИ nulls_last=True, чтобы явно получить нужный вам порядок.

Это упоминается в документах , но, возможно, не так явно, как могло бы быть :

Использование F () для сортировки нулевых значений

Использование F () и аргумента ключевого слова nulls_first или nulls_last для Expression.as c () или des c ( ) управлять порядком нулевых значений поля. По умолчанию порядок зависит от вашей базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...