首先订购带有特定对象的Django查询集

时间:2018-08-27 21:17:44

标签: django django-models django-queryset

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

{% for u in users_list %}

    {{u.name}}

{% endif %}

如果我愿意,是否可以将两个或多个用户排在顶部?

例如,有一个用户,当当前用户访问该列表时,可以在将变量发送到模板之前排除我,从而将他排名在前,而无需进行特定排序。

1) me
2) user2
3) user3

3 个答案:

答案 0 :(得分:3)

如果要在查询集的顶部按ID排序特定的对象,则可以在conditional expression上排序-例如,将当前用户放在顶部,并按名称对其他用户排序:< / p>

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

答案 1 :(得分:1)

在您的视图中,创建要显示的用户列表。为了显示当前用户,您可以使用regex_replace获取当前用户并将其附加到列表中,然后再添加其余用户。在您的模板中,您会这样做

- hosts: all
  gather_facts: no
  vars:
    class_names:
    - 'App\ElasticSearch\Configurators\UserConfigurator'
    - 'App\ElasticSearch\Configurators\ClientConfigurator'
  tasks:
  - set_fact:
      index_names: >-
        [
        {% for cn in class_names -%}
        {{ '' if loop.first else ',' }}
        {{ cn |
           regex_replace(".*\\([^\\]+$)", "\1") |
           regex_replace("([A-Z])([a-z])", "\x00\1\2") |
           lower | replace("\x00", "_") | regex_replace("^_", "") |
           to_json }}
        {% endfor %}
        ]
    with_items: '{{ class_names }}'
  - debug: var=index_names verbosity=0
  - debug: var=item verbosity=0
    with_items: '{{ index_names }}'

应该找到您想要的东西

更新示例

TASK [debug] *******************************************************************
ok: [localhost] => (item=user_configurator) => {
    "item": "user_configurator"
}
ok: [localhost] => (item=client_configurator) => {
    "item": "client_configurator"
}

如果您想吸引其他人,您只需使用

request.user

答案 2 :(得分:0)

分配查询集,您可以根据用户中的字段订购users_list。为此,您在查询集中具有sort方法。在我看来,您需要添加一个字段,以便可以对该字段进行排序。例如,您添加一个默认为0的等级字段,然后添加最高等级的值。

完整的示例在这里定义:https://docs.djangoproject.com/en/2.1/topics/auth/customizing/#a-full-example

在您的CustomUserMdel中添加一个字段rank = models.IntegerField(default=0)

然后在您的视图中,您需要按等级排序:

from django.contrib.auth import get_user_model

User = get_user_model()

# in your view...
user_list = User.objects.all().sort_by('rank')