2 つのモデル (簡易版) があります。
class Contestant(models.Model):
email = models.EmailField(max_length=255, unique=True)
# plus some other fields
@property
def total_points(self):
return self.points.aggregate(total=Sum('value'))['total'] or 0
class Points(models.Model):
contestant = models.ForeignKey(Contestant, related_name='points')
value = models.PositiveIntegerField()
# plus some other fields which determine based on what we
# awarded ``Points.value``
競技者のリストとそのtotal_points
値を表示すると、結果ごとに追加のクエリが発生します。つまり、次のクエリが実行されます。
- 出場者のリストを取得する
- 第 1 競技者のフェッチ
total_points
値 total_points
2 番目の出場者の値をフェッチ- 等
次のようにクエリセットを変更して、データをプリフェッチしようとしました。
Contestant.objects.filter(...).prefetch_related('points')
...ただし、機能しても、競技者をリストするときにプリフェッチされたデータは使用されません (そのため、各結果は引き続きtotal_points
個別のクエリでフェッチしようとします)。
次のことは可能ですか。
- 個々のモデル オブジェクトにデータを入力するときに、@property フィールドにプリフェッチされた値を使用するように ORM に指示します (たとえば、
Contestant.total_points
@property メソッド内のプリフェッチされた値にアクセスします)。 - または(上記の例とは対照的に)別の方法でそれらをプリフェッチしますか?
- または、まったく異なるアプローチを使用して同じ結果を達成しますか?
tastypie
(問題があれば、結果を にリストしています。)
ありがとうございました。