Как выбрать пользователей на основе их профиля - PullRequest
1 голос
/ 04 июля 2010

У меня сложный запрос, построенный на основе профиля пользователя, я начинаю с

qset = Profile.objects

связки, которая работает, чтобы возвращать мне объекты профиля (она использует объекты Q и при необходимости игнорирует некоторые поля, еслиони были оставлены пустыми)

Я мог бы захватить пользователей с помощью selected_related(), но это все равно оставляет мне список профилей, а не список пользователей.

Из-за способа, которым мои шаблонынастроены для других целей, мне бы очень хотелось иметь список пользователей

{% for user in users %}

Как я могу преобразовать его набор запросов для объектов профиля в один для пользователей.

В настоящее время я использую:

profile_userids = list(qset.values('user_id'))
user_ids = [d['user_id'] for d in profile_userids]
users = User.objects.in_bulk(user_ids)

, что приводит к 2 запросам и преобразованию всех user_id в объекты python.

Как использовать набор запросов, сгенерированный мной для объекта Profiles, для выбора пользователей

Ответы [ 2 ]

2 голосов
/ 04 июля 2010

Сделайте ваши объекты Q ссылающимися на profile__whatever и используйте их в User.objects.filter().

0 голосов
/ 17 июля 2010

Оказывается, мне пришлось модифицировать шаблоны.В Django auth.user есть ошибка.Когда код представления выглядит следующим образом:

@login_required
def test(request):
    a = User.objects.filter(pk=request.user.id).select_related('profile').get()
    return render_to_response('test.html', {'a':a,})

, а шаблон выглядит как

a.username {{ a.username }}<br />
a.get_profile.age {{ a.get_profile.age }}<br />

a.get_profile игнорирует тот факт, что профиль был загружен с помощью select_related, и выполняет отдельный запрос дляпрофиль.

Однако, если вы закодируете его как:

@login_required
def test(request):
    a = Profile.objects.filter(user=request.user).select_related('user').get()
    return render_to_response('peeks/test.html', {'a':a,})

и шаблон как:

a.user.username {{ a.user.username }}<br />
a.age {{ a.age }}<br />

, то вы получите все это одним нажатием, икогда вы отображаете 25 профилей на одной странице, это имеет большое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...