如何改进以下查询

时间:2012-08-23 21:12:10

标签: mysql django django-models

我需要获取给定提供商的所有用户的列表。用户可以具有多个提供者,并且提供者可以具有多个用户。以下是我到目前为止的情况:

我有以下表格:

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

2 个答案:

答案 0 :(得分:1)

使用prefetch_related(); select _related() ManyToManyField无法使用providers = Provider.objects.order_by('provider').all().prefetch_related('userprofile_set')

QuerySet

来自文档:

  

返回select_related,它将在一个批处理中自动检索每个指定查找的相关对象。

     

这与prefetch_related具有相似的目的,因为它们都旨在阻止因访问相关对象而导致的数据库查询泛滥,但策略却截然不同。

     

...

     另一方面,

select_related对每个关系进行单独查找,并在Python中进行“加入”。这允许它预取多对多和多对一对象,除了{{1}支持的外键和一对一关系之外,这些对象无法使用select_related完成。 }。

答案 1 :(得分:0)

我没有使用django,但我刚刚在这里找到答案:docs.djangoproject.com

providers = Provider.objects.select_related().order_by('provider').all()
相关问题