django - 首先订购具有特定对象的 django 查询集
问题描述
我有一个显示在模板中的用户列表,如下所示。
{% for u in users_list %}
{{u.name}}
{% endif %}
如果我愿意,有没有办法将两个或更多用户排在首位?
例如,对于一个用户,当当前用户访问该列表时,我可以通过在将变量发送到模板之前将我排除在外,将他排在顶部而无需特定顺序。
1) me
2) user2
3) user3
解决方案
如果您想在查询集的顶部按 id 对特定对象进行排序,可以在条件表达式上进行排序- 例如,将当前用户放在顶部,并按名称对其他用户进行排序:
from django.db.models import Case, When
from django.contrib.auth.models import User
users = User.objects.order_by(
Case(When(id=request.user.id, then=0), default=1),
'last_name',
'first_name'
)
要将多个对象放在顶部,只需调整When
条件:
ids_at_top = [1, 2]
users = User.objects.order_by(
Case(When(id__in=ids_at_top, then=0), default=1))
我还会考虑您是否可以通过更简单的方式实现您想要的 - 例如,您可以获取当前用户,将它们从主查询集中排除,然后在模板中单独显示,如下所示
# in the view
current_user = request.user
users = User.objects.exclude(id=current_user.id)
# in the template
{{ current_user.name }}
{% for u in users %}
{{ u.name }}
{% endif %}
推荐阅读
- ssl - 如何在带有 TLS 的 FTP 的 Windows 10 命令提示符中构造 CURL FTPS 命令
- asp.net - Azure SignalR 服务的 SignalR 脚本标记
- javascript - 节点/快递应用程序中错误处理的正确方法是什么?
- laravel - ErrorException (E_NOTICE) 试图获取非对象的属性“名称”
- python - 迭代快速排序步骤 - 乌龟中的可视化
- python - tkinter 所有小部件在彼此之上
- c# - 分组在 linq to sql 中不起作用。正确的语法是如何做到的
- popup - 关于 Spotify 弹出窗口
- javascript - 如何在 Angular 中多次将相同的数据从父级传递到组件?
- ansible - 如何从模块结果中提取深度嵌套的值到变量中以供以后的任务使用?