代码之家  ›  专栏  ›  技术社区  ›  boatcoder

如何根据用户配置文件选择用户

  •  1
  • boatcoder  · 技术社区  · 15 年前

    我有一个基于用户配置文件的复杂查询

    qset = Profile.objects
    

    一堆用于返回我的profile对象的东西(它使用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个查询,并将所有用户的id转换为python对象。

    如何使用在Profiles对象上生成的queryset来选择用户?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Ignacio Vazquez-Abrams    15 年前

    让你的Q对象引用 profile__whatever 把它们用在 User.objects.filter() .

        2
  •  0
  •   boatcoder    15 年前

    @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\u profile忽略这个事实,即配置文件是用select\u 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个配置文件时,这会产生相当大的差异。