Django 用户上次登录 = NULL 在本地和生产之间以不同的方式排序

Django users last login = NULL ordered in different way between local and production

我有这个 ListView,其中 returns 由 last_login 排序的用户列表。

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'))

本地用户按 last_login NULL < NOT_NULL 排序,因此在降序情况下,尚未登录的用户位于用户列表的底部。 但在生产中 NULL > NOT_NULL 并且相同的用户位于列表的顶部。

本地我使用 squlite 数据库和 manage.py 中包含的网络服务器 生产: postgresql + gunicorn + nginx

您可以指定如何用nulls_first=Truenulls_last=True.asc(…) [Django-doc] or .desc(…) [Django-doc]排序,例如:

from django.db.models import F

return EmailUser.objects.order_by(
    <strong>F(</strong>'last_login'<strong>).asc(nulls_last=True)</strong>,Upper('last_name'), Upper('first_name'), Upper('email')
)

这将添加一个如下所示的子句:

ORDER BY <strong>last_login IS NOT NULL</strong>, last_login, …

因此强制将空值放在最后。