0

私は2つの関連モデルを持っています

class Person(models.Model):
    name = CharField(max_length=100)


class PersonPicture(models.Model):
    image = ImageField(...)
    person = ForeignKey(Person)

テンプレートに送信し、context['persons']=Person.objects.all() 関連するマネージャーにアクセスします。

{% for p in persons %}
    {{ p.name }}
    {{ p.personpicture_set.all.0.image }}
{% endfor %}

これにより{{ p.personpicture_set.all.0.image }}、サイクル内のすべてのアイテムに対して 1 つのクエリが生成されます。

からのクエリが 1 つだけになるように、人物モデルの「人物」画像に関連する方法はありますかPerson.objects.all()。テンプレートではできましたが{{ p.images_custom_attr.0 }}、クエリは生成されませんでした。

4

1 に答える 1

0

select_related()またはを使用できますprefetch_related()。違いについては、Django docから-

select_related()可能な限り外部キーに従います。次のモデルがある場合:

from django.db import models

class City(models.Model):
    # ...
    pass

class Person(models.Model):
    # ...
    hometown = models.ForeignKey(City)

class Book(models.Model):
    # ...
    author = models.ForeignKey(Person) ...then a call to 

Book.objects.select_related().get(id=4)関連する Person と関連する City をキャッシュします

select_relatedSQL 結合を作成し、関連するオブジェクトのフィールドを SELECT ステートメントに含めることで機能します。このため、 select_related は同じデータベース クエリで関連オブジェクトを取得します。ただし、「多数」の関係にまたがって結合した結果として結果セットが非常に大きくなるのを避けるために、select_related は単一値の関係 (外部キーおよび 1 対 1) に限定されます。

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

于 2013-07-24T21:26:47.880 に答える