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
{% for profile in profiles  %}
{{ profile.user.username }} : {{ profile.birth_date }}
{% endfor %}
于 2012-08-30T10:17:17.093 に答える
0

特にエレガントではありませんが、ビューで raw() を使用して、1 回のリクエストでデータを取得できます。

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 に答える