Последний вход пользователей Django = NULL упорядочен по-разному между локальной и производственной версиями
У меня есть ListView, который возвращает список пользователей, упорядоченный по последнему_логину.
class ListaUtentiOrderedByLastLogin(StaffRequiredMixin, ListView):
model = EmailUser
context_object_name = "lista_utenti"
template_name = "emailusers/lista_utenti.html"
paginate_by = settings.PAGINATION_NUM
def get_queryset(self):
if self.kwargs['order'] == "asc":
return EmailUser.objects.order_by('last_login',Upper('last_name'), Upper('first_name'), Upper('email'))
else:
return EmailUser.objects.order_by('-last_login',Upper('last_name'), Upper('first_name'), Upper('email'))
Локально пользователи упорядочены по последнему_логину NULL < NOT_NULL, поэтому в нисходящем случае пользователи, которые еще не вошли в систему, находятся внизу списка пользователей. Но в production NULL > NOT_NULL и те же пользователи находятся в верхней части списка.
Локально я использую squlite db и веб-сервер, включенный в manage.py Производство: postgresql + gunicorn + nginx
Вы можете указать, как заказать с помощью nulls_first=True или nulls_last=True с помощью .asc(…) [Django-doc] или .desc(…) [Django-doc], например:
from django.db.models import F
return EmailUser.objects.order_by(
F('last_login').asc(nulls_last=True),Upper('last_name'), Upper('first_name'), Upper('email')
)
это добавит предложение, которое выглядит следующим образом:
ORDER BY last_login IS NOT NULL, last_login, …
и, таким образом, заставляет нули размещаться последними.