2012-04-20 73 views
3

比方說,我有一個電影,書籍和軟件的數據庫,他們都繼承了一個單一的項目模型。如何在一對一關係可能不同的反向一對一關係中預取相關?

class Item(models.Model): 
    ... 

class Movie(models.Model): 
    item = models.OneToOneField(Item) 
    ... 

class Book(models.Model): 
    item = models.OneToOneField(Item) 
    ... 

class Software(models.Model): 
    item = models.OneToOneField(Item) 
    ... 

現在我想就項目數據庫查詢,但我想對相關對象拿起這個項目,無論是電影,書籍或軟件。如果所有的項目都是一個類型,比如說電影,然後我可以做到以下幾點:

Item.objects.prefetch_related('movie') 

不過,我需要能夠不管它是什麼類型獲取相關對象。我可以運行:

Item.objects.prefetch_related('movie', 'book', 'software') 

這會找到相關的對象,無論它是什麼類型,這將是有效的嗎?有沒有更好的方法來做到這一點?

回答

1

我會假設OneToOneField■找related_name設置爲您查詢集的例子表明,也就是說,'movie',分別'book''software'

要向後遍歷一對一關係,您不需要prefetch_related,這是易於使用由select_related自動生成的LEFT OUTER JOIN實現的內容。這意味着,你應該能夠做到

Item.objects.select_related('movie', 'book', 'software') 

和每個返回項目實例會自動包含相應MovieBookSoftware緩存實例(如果存在的話,當然)。當你想避免O(N)的查詢與問題時,才需要

prefetch_related許多一對多或多對一的一對一的關係,也就是與ManyToManyFieldForeignKey反向穿越。