Закажите сначала набор запросов django с конкретными объектами - PullRequest
0 голосов
/ 28 августа 2018

У меня есть список пользователей, отображаемых в шаблонах, подобных следующему.

{% for u in users_list %}

    {{u.name}}

{% endif %}

Есть ли способ ранжировать двух или более пользователей сверху Если я хочу?

Например, для одного пользователя, когда текущий пользователь посещает этот список, я могу поставить его в топ без определенного порядка , исключив меня перед отправкой переменной в шаблон.

1) me
2) user2
3) user3

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Если вы хотите упорядочить определенные объекты по идентификатору в верхней части набора запросов, вы можете заказать условное выражение - например, поставить текущего пользователя на вершину и упорядочить других пользователей по имя:

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 %}
0 голосов
/ 29 августа 2018

Укажите набор запросов, который вы можете заказать 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')
0 голосов
/ 28 августа 2018

По вашему мнению создайте список пользователей, которых вы хотите отобразить. Для отображения текущего пользователя вы можете использовать request.user, чтобы получить текущего пользователя и добавить его в список, за которым следуют остальные пользователи. В вашем шаблоне вы бы сделали

<ol type="1">
{% for u in users_list %}

    <li>{{u.name}}<li>

{% endif %}
</ol>

следует из того, что вы ищете

Пример обновления

user_list = list(Users.objects.filter(name="Test")) #Or how ever you want to get the users.
user_list.insert(0,request.user)

если вы хотите получить другого человека, вы просто получите пользователя, используя

another_person = User.objects.get(id=some_id)
user_list.insert(0,another_person)
...