3

在 django 模板中,当您执行循环以显示许多用户的配置文件信息时,您调用 get_profile,从而生成尽可能多的 SQL 请求:

{% for user in users %}
{{ user.username }} : {{ user.get_profile.birth_date }}
{% endfor %}

如果要显示 50 个用户,它将生成 50 个 SQL 请求来获取每个用户的配置文件。

有没有一种优雅的方法来减少请求的数量?

编辑 :

最终目标是管理一个项目列表,其中项目具有用户对象作为属性。示例:stackoverflow 中的每个问题都有一个用户作为创建者。如何在最少的 SQL 请求中显示用户配置文件信息时列出所有最近的问题:

模板应该是这样的:

{% for question in recent_questions %}
{{ question.title }}
{{ question.body }}
{{ question.creator.username }}
{{ question.creator.get_profile.age }}
{{ question.creator.get_profile.country }}
{% endfor %}

但这会产生太多的 SQL 请求...

4

4 回答 4

1

我会为这种情况编写自己的模板标签,

@register.simpletag(takes_context=True)
def load_profiles(context,users):
    context['profiles']=ProfileClass.objects.select_related().filter(user__in=users)
    return ''

模板:

{% load_profiles users %}
{% for one in profiles%}
    {{one.user.username}} : {{one.birth_date }}
{% endfor %}
于 2012-08-30T10:09:06.270 回答
1

我认为您可以使用select_related查询。但我不确定是否.get_profile()会使用缓存实例命中数据库。在这种情况下,我建议您在视图中查询配置文件列表,select_related以便profile.user缓存和可用,并将配置文件列表传递给模板而不是用户列表。

于 2012-08-30T10:09:50.747 回答
0

它不是特别优雅,但您可以在视图中使用 raw() 在一个请求中获取数据:

users = User.objects.raw("SELECT **the data you want**, birth_date FROM auth_user,
    app_userprofile as p WHERE p.user_id=auth_user.id"
于 2012-08-30T10:14:47.777 回答
0
{% for profile in profiles  %}
{{ profile.user.username }} : {{ profile.birth_date }}
{% endfor %}
于 2012-08-30T10:17:17.093 回答