0

特定のプロバイダーのすべてのユーザーのリストを取得する必要があります。ユーザーは複数のプロバイダーを持つことができ、プロバイダーは複数のユーザーを持つことができます。これが私がこれまでに持っているものです:

次のテーブルがあります。

class Provider(models.Model):
    provider = models.CharField(max_length=100, primary_key=True)

class UserProfile(models.Model):
    user = models.ForeignKey(User, primary_key=True)
    provider = models.ManyToManyField(Provider, db_column='provider')

私からしてみれば:

providers = Provider.objects.order_by('provider')

そして私のテンプレートでは:

{% for provider in providers %}
<tr>
    <td class="provider">
        {{ provider.provider }}
    </td>
    <td class="email">
        {% for profile in provider.userprofile_set.all %}
            {{ profile.user }}
        {% endfor %}    
    </td>
</tr>
{% endfor %}

テンプレートで Provider QuerySet を反復処理しているため、これにより約 250 のクエリが生成されます。上記をどのように改善しますか -prefetch_relatedまたはselect_relatedここで使用する方法はありますか?

4

2 に答える 2

1

使用しprefetch_related()ます。select _related()sでは機能しませんManyToManyField:

providers = Provider.objects.order_by('provider').all().prefetch_related('userprofile_set')

ドキュメントから:

QuerySet指定されたルックアップごとに関連オブジェクトを 1 回のバッチで自動的に取得する を返します。

select_relatedこれは、関連するオブジェクトへのアクセスによって引き起こされるデータベース クエリの大洪水を停止するように設計されているという点で、 と同様の目的を持っていますが、戦略はまったく異なります。

...

prefetch_related一方、各関係に対して個別のルックアップを行い、Python で「結合」を行います。select_relatedこれにより、 でサポートされている外部キーと 1 対 1 の関係に加えて、 では実行できない多対多および多対 1 オブジェクトのプリフェッチが可能になりますselect_related

于 2012-08-23T22:20:43.187 に答える
0

私はdjangoを使用していませんが、ここで答えを見つけました:docs.djangoproject.com

providers = Provider.objects.select_related().order_by('provider').all()
于 2012-08-23T21:27:59.303 に答える