2017-02-03 92 views
0

我知道已經有類似的question,但我認爲我的情況有點複雜,因爲我有不同的入口點。Django:prefetch_related()與m2m通過關係v2

這是我的模型:

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_Featurescore.score的特定實例。

我的工作的查詢訪問至少都在一個高性能的方式相互作用:

m_User.objects.all().prefetch_related('ips__interactions') 

但我不能找出正確的「prefetch_related'語句訪問m_Featurescore.score這樣

db_obj_interaction.featurescore.get(fk_feature=db_obj_feature).score 

沒有進行大量的查詢。

我已經嘗試了以下的幾乎所有組合:

'ips__interactions__features__featurescore' 

有什麼建議?

+1

如何「ips__interactions__featurescore」的建議應該被使用? 另外,使用get()方法意味着您迫使ORM進行查詢。您需要使用all()方法才能利用預取。如果您需要過濾,請使用Prefetch()對象。 – noamk

+0

@noamk完美。謝謝! –

回答

0

我找到了答案,以我自己的noamk的註釋中的幫助問題:

我沒有考慮到的get() - 在db_obj_interaction.featurescore.get(fk_feature=db_obj_feature).score方法將發出一個新的查詢,每次它被稱爲(它還挺現在明顯)。

因此我簡單地重構了我的代碼,現在我不再需要get(),並且可以使用預取的好處。

如果有人仍然需要過濾Prefetch()-object通過noamk