Последний вход пользователей 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, …

и, таким образом, заставляет нули размещаться последними.

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