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=True
或nulls_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, …
因此强制将空值放在最后。
我有这个 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=True
或nulls_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, …
因此强制将空值放在最后。