django - 首先订购具有特定对象的 django 查询集

标签 django django-models django-queryset

我有一个显示在模板中的用户列表,如下所示。

{% for u in users_list %}

    {{u.name}}

{% endif %}

如果我愿意,有没有办法将两个或更多用户排在首位?

例如,对于一个用户,当当前用户访问该列表时,我可以通过在将变量发送到模板之前将我排除在外而将他排在最前面,而没有特定的顺序。
1) me
2) user2
3) user3

最佳答案

如果您想通过查询集顶部的 id 对特定对象进行排序,您可以在 conditional expression 上进行排序。 - 例如,将当前用户放在顶部,并按名称排列其他用户:

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 %}

关于django - 首先订购具有特定对象的 django 查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52047107/

相关文章:

django-models - Django 查询基于更大的日期

Django:同一模型上不同查询集的联合

python - 根据 content_type 和字段名链接识别 Django User 表

python - Sockjs - 在 Python 代码中向 sockjs-tornado 发送消息

python - 显示其他属性值(如果 django 模板中已知)

python - Django:save() vs update() 来更新数据库?

Django模型字段在添加新字段时基于同一模型中的另一个字段添加默认值

sql - 为什么 Django 显式地在唯一字段上创建索引

django - 流式 HTTP 响应,刷新到浏览器

Django - 过滤外键属性