2016-05-13 53 views
0

我堅持嘗試寫一個Django ORM查詢來獲取以下查詢的模擬:Django的 - 連接兩個多到一個關係

vendors = Vendors.objects.select_related('legal_entities') #....and then I want to also get legal_entities_details 

我的模型:

class LegalEntitiesDetails(models.Model): 
     legal_entities = models.ForeignKey(LegalEntities, models.CASCADE) 
    class LegalEntities(models.Model): 
     #...Some fields 
    class Vendors(models.Model): 
     legal_entities = models.ForeignKey(LegalEntities, on_delete=models.CASCADE) 

我無法弄清楚如何通過select_related做到這一點。您看到的問題是我無法編寫簡單的鏈式selected_related,因爲供應商和legal_entities_details與legal_entities相關。請忍受這個問題,我是Django的新手。

回答

1

您是否嘗試過prefetch相關?來自文檔:

select_related通過創建SQL連接並在SELECT語句中包含相關對象的字段來工作。爲此,select_related在相同的數據庫查詢中獲取相關對象。但是,爲避免通過加入「多」關係而導致的更大的結果集,select_related僅限於單值關係 - 外鍵和一對一。

另一方面,prefetch_related爲每個 關係執行單獨查找,並執行Python中的「連接」。這使得它可以預取多對多和多對一的對象,除了select_related支持的外鍵和一對一關係外,還可以使用select_related來完成 。 more here

還當你的關係不是直接在您從預取的類定義,你可以使用classname_set產卵反向關係

這樣的事情應該工作:

Vendors.objects.select_related('legal_entities') 
       .prefetch_related('legal_entities__legalentitiesdetails_set') 
+0

那麼我該如何參考legal_entities_details? –

+0

我嘗試類似sp.legal_entities__legal_entities_details –

+0

我不完全確定camelCase是如何爆炸的。試試prefetch_related('legal_entities__legalentitiesdetails_set')或prefetch_related('legal_entities__legal_entities_details_set')。無論哪種方式,不要忘記在最後追加_set。 – okolimar

1

你不能用select_related這樣做,因爲它只適用於轉發關係,而LegalEntities和LegalEntitiesDetails之間的鏈接是向後關係。您需要使用prefetch_related,後者可以跟隨後退關係,但使用兩個查詢來執行此操作。

+0

謝謝,丹尼爾。您能否提供一個如何編寫查詢的簡短示例。只爲了解最佳做法 –

相關問題