我根据用户个人资料构建了一个复杂的查询,我从
开始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对象。
如何使用我在“个人档案”对象上生成的查询集来选择用户?
答案 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个配置文件时,这会产生相当大的差异。