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 %}

这会产生大约 250 个查询,因为我正在遍历模板中的 Provider QuerySet。我将如何改进上述内容 - 有没有办法使用prefetch_relatedselect_related在这里?

4

2 回答 2

1

使用prefetch_related()select _related()不适用于ManyToManyFields:

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

从文档:

返回一个QuerySet将在单个批次中自动检索每个指定查找的相关对象的 a。

这与 的目的相似select_related,因为两者都旨在阻止由访问相关对象引起的大量数据库查询,但策略完全不同。

...

prefetch_related另一方面,对每个关系进行单独的查找,并在 Python 中进行“加入”。这允许它预取多对多和多对一对象,这是使用 无法完成select_related的,除了由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 回答