使用ManytoMany字段进行Django查询优化

时间:2012-11-07 21:52:24

标签: django

我发现我模板中的这一段代码(以粗体显示)会产生约250个查询并使事情变得非常缓慢:

{% for part in latestupdates %}
{{ part }}
      **{% for unipart in part.uniparts.all|slice:":5" %}**
      <tr>
        <td>
            <p style ="font-size:12px;"><a href = "/spices/{{ unipart_id }}/view_part">{{ unipart.part }}</a></p></td>
        <td><img src="{{ STATIC_URL }}images/company_logos/thumbs/{{part.model.all.0.manufacturer}}.jpg" alt="{{part.model.all.0.manufacturer}} {{unipart.part}}" height="24" width='115' /></td>
      </tr>
      {% endfor %}
{% endfor %}

Unipart与Part之间的关系如下:

class UniPart (models.Model):
    model = models.ManyToManyField (Part, related_name = 'uniparts')

我的观点如下:

latestupdates = Part.objects.all().order_by('-added')

基本上我想要的是获得链接到Part的5个Unipart对象。但这耗费了我很大的时间!什么是比我做的更有效的方式?我实际上有> 600个数据库查询,这是非常可悲的,我正在阅读数据库优化,但对于这一点,我找不到任何相关的。救命! : - )

1 个答案:

答案 0 :(得分:3)

尝试prefetch_related() QuerySet的方法。

latestparts = Part.objects.all().prefetch_related('uniparts').order_by('-added')

但请注意您尝试预取的项目数量。因为它会让你的记忆力过高。

是的,这只适用于django 1.4我认为。

如果您有models.ForeignKey字段(不是您的情况),请使用select_related()。这适用于较旧版本的django。