2016-11-21 105 views
0

我有一個以下型號:Django的外鍵VS複雜的查詢

class Library(models.Model): 
    title = models.CharField(max_length = 255) 

class Author(models.Model): 
    name = models.CharField(max_length = 255) 

class Book(models.Model): 
    name = models.CharField(max_length = 255) 
    library_id = models.ForeignKey(Library) 
    author_id = models.ForeignKey(Author) 
  1. 我如何獲得作者是誰的書籍的列表是在一個特定的圖書館嗎?
  2. 作者是否直接向庫提供外鍵更高效?
+0

您是指屬於特定圖書館的作者的含義是什麼?書籍屬於圖書館,所以在Book中有一個FK是完全正確的。但作者?你確定嗎? – lucasnadalutti

+0

作者爲什麼要特定於圖書館 – marcusshep

+0

我想獲取書籍在圖書館中的作者列表。這只是一個例子。 – Tomas

回答

0

通過使用reverse lookups across the Foreign Key relationships,您可以獲取書籍在特定圖書館中的作者列表。

some_library = Library.objects.get(0) 
authors_in_library = Author.objects.filter(book__library_id=some_library) 

您不應該將library字段添加到作者。這是過早的優化,會使事情變得複雜,因爲如果一本書被移動到一個新的庫中,您將需要更新兩個關係而不是一個關係。您還必須在交易中進行更新。除非你面臨重大的可衡量的性能問題,否則不要考慮這一點。

此外,不要添加_id後綴到您的領域。它們在Django中被視爲實際的對象關係。它也會與僅進行id-lookup的Django adds its own _id to foreign keys這一事實相沖突。您的查詢應該如下所示,沒有_id

Author.objects.filter(book__library=some_library) 
+0

您的查詢將返回庫的列表,而不是作者。 – Tomas

+0

你是對的,在我的需求混淆的地方。修復... – Soviut

+0

謝謝!是否值得向作者添加庫密鑰以減少複雜的查詢?或者,在模型中使用更少的鍵並執行復雜的查詢會更好? – Tomas