すでに同様の質問があることは知っていますが、エントリポイントが異なるため、私の場合はもう少し複雑だと思います。
これらは私のモデルです:
class m_Interaction(models.Model):
fk_ip = models.ForeignKey('m_IP', related_name="interactions")
class m_User(models.Model):
name = models.CharField(max_length=200)
class m_IP(models.Model):
fk_user = models.ForeignKey('m_User', related_name="ips" )
class m_Feature(models.Model):
name = models.CharField(max_length=200)
m2m_interaction = models.ManyToManyField(m_Interaction, related_name='features', through='m_Featurescore')
class m_Featurescore(models.Model):
score = models.FloatField(null=False)
fk_interaction = models.ForeignKey(m_Interaction, related_name='featurescore')
fk_feature = models.ForeignKey(m_Feature, related_name='featurescore')
m_Userから始めて、m_IPを介した相互作用(m_Interaction)とは逆の関係に従います。次に、m_Featureの特定のインスタンスの各インタラクションのすべてのm_Featurescore.scoreを取得します。
パフォーマンスの高い方法で少なくともすべてのインタラクションにアクセスするための私の作業クエリ:
m_User.objects.all().prefetch_related('ips__interactions')
しかし、このようにm_Featurescore.scoreにアクセスするための正しい「prefetch_related」ステートメントを理解できません。
db_obj_interaction.featurescore.get(fk_feature=db_obj_feature).score
多くのクエリを行うことなく。
私はすでに次のほとんどすべての組み合わせを試しました:
'ips__interactions__features__featurescore'
助言がありますか?
コメントでnoamkの助けを借りて自分の質問に対する答えを見つけました:
のget()メソッドがdb_obj_interaction.featurescore.get(fk_feature=db_obj_feature).score
呼び出されるたびに新しいクエリを発行するとは考えていませんでした(今では明らかです)。
したがって、コードを再構築しただけで、get()は不要になり、プリフェッチの利点を利用できるようになりました。
それでも誰かがPrefetch()をフィルタリングする必要がある場合は、noamkの提案に従ってオブジェクトを使用する必要があります
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加