4

私のデータベースには次のスキーマがあります。

class Product(models.Model):
    pass

class Tag(models.Model):
    product = models.ForeignKey(Product)
    attr1 = models.CharField()
    attr2 = models.CharField()
    attr3 = models.CharField()

class AlternatePartNumber(models.Model):
    product = models.ForeignKey(Product)

つまり、aProductには多くTagの s があり、aProductには多くAlternatePartNumberの s があります。 Tagは、 の属性のコレクションですProduct

の 3 つの属性を指定して、一致する (複数の場合もある)関連付けられたと、各製品のすべてのTagを選択したいと考えています。ProductAlternatePartNumber

現在、私はこれを行います:

# views.py
results = Tag.objects.
    filter(attr1=attr1).
    filter(attr2=attr2).
    filter(attr3=attr3)

# a template
{% for result in results %}
    {% for alternate in result.product.alternatepartnumber_set.all %}
        {{ alternate.property }}
    {% endfor %}
{% endfor %}

これにより、一致の数に応じて、何千ものクエリを実行できます。これを最適化する良い方法はありますか?使用Tag.objects.select_related().filter...してみましたが、ある程度は役に立ちましたが、十分には役に立ちませんでした。

4

1 に答える 1

8

Product と AlternatePartNumber の関係は逆の ForeignKey 関係であるため、機能しselect_related()ません。prefetch_related()よりも少し攻撃的ではありませんが、select_related()多対 1 の関係を処理できる が必要です。

私は以前に prefetch_related() を使用したことがありませんが、ドキュメントを正しく読んでいる場合は、次のようなものが必要ですTag.objects.prefetch_related('product__alternatepartnumber_set').filter...。それが機能しない場合は、AlternatePartNumber モデルで related_name を指定し、代わりにそれを使用しますalternatepartnumber_set

于 2012-04-25T19:05:46.223 に答える