1

テンプレート内のこの1ビットのコード(太字)は、最大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 %}

ユニパートとパートの関係は次のとおりです。

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

私の見解は次のとおりです。

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

基本的に私が欲しいのは、Partにリンクする5つのUnipartオブジェクトを取得することです。しかし、これは私に多大な時間を費やしています!!! 私がしたよりも効率的な方法は何ですか?私は実際に600を超えるデータベースクエリを持っていますが、これはかなり哀れで、データベースの最適化について読んでいますが、このビットについては、関連するものを見つけることができません。ヘルプ!:-)

4

1 に答える 1

3

QuerySetのメソッドprefetch_related()を試してください。

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

ただし、プリフェッチしようとしているアイテムの量に注意してください。それはあなたの記憶を圧倒する可能性があるからです。

そして、はい、これはdjango 1.4私が思うにのみ機能します。

フィールドがある場合は(ケースではなく)select_related()を使用しmodels.ForeignKeyます。これは、古いバージョンのdjangoで機能します。

于 2012-11-07T23:31:00.923 に答える