如何根据用户的个人资料选择用户

时间:2010-07-03 20:52:26

标签: python django

我根据用户个人资料构建了一个复杂的查询,我从

开始
qset = Profile.objects

一堆能够返回我的配置文件对象的东西(它使用Q对象,如果它们留空,可选择忽略一些字段)

我可以使用selected_related()抓住用户,但这仍然留给我一个配置文件列表,而不是用户列表。

由于我的模板设置为其他东西的方式,我真的想有一个用户列表

{% for user in users %}

如何将Profile对象的查询集转换为用户的查询集。

目前我使用:

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对象。

如何使用我在“个人档案”对象上生成的查询集来选择用户?

2 个答案:

答案 0 :(得分:2)

让您的Q对象引用profile__whatever并在User.objects.filter()中使用它们。

答案 1 :(得分:0)

原来我必须修改模板。 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个配置文件时,这会产生相当大的差异。