2017-05-30 161 views
1

我有兩個模型是通過外鍵連接的。如何創建一個django模型來過濾外鍵字段

Book 
isbn - this is a unique value 

Order 
book_isbn - this should refer to Book's isbn above. 
  1. 如何介紹訂貨型號的圖書的ISBN作爲外鍵。
  2. 我要查詢已給予ISBN訂單(即濾波器階對象,其中book_isbn = given_isbn

回答

0

你可以做模特一樣,

class Book(models.Model): 
    isbn = models.CharField(unique=True, primary_key=True, max_length=5) 
    #some fields.... 

class Order(models.Model): 
    book = models.ForeignKey(Book, related_name='orders') 
    #another fields.. 

然後,你可以做這樣的查詢,

given_isbn = 'some_value' 
items = Order.objects.filter(book=given_isbn) 

或給定書的情況下,

orders = book.orders.all() 

編輯

或者你也可以從書模型ISBN字段中刪除primary_key=True並做 查詢一樣,

items = Order.objects.filter(book__isbn=given_isbn) 

然後,Django提供了對每個對象實例的自動遞增的主鍵。

+0

related_name是必需的嗎?我可以直接使用過濾器查詢作爲Order.objects.filter(書= ) –

+0

相關的名稱是爲了使反向查詢更具可讀性......不要擔心它......是的,你可以查詢這樣的訂單對象... – zaidfazil

+0

我更喜歡最後的解決方案,因爲它不會更改由django提供的自動ID。當我參考book__isbn = given_isbn時,它起作用。 (兩個下劃線) –

0

型號:

class Book(models.Model): 
    isbn = models.CharField(primary_key=True, max_length=5) 

class Order(models.Model): 
    book = models.ForeignKey(Book) 
    #another fields.. 

得到您想要的書。

book = Book.objects.get(isbn=isbn) 

獲取書籍的相關訂單。

orders = book.order_set.all() 

它將返回特定書籍的所有訂單。

另一種方法:通過過濾器查詢簡單過濾所有記錄。

order_qs = Order.objects.filter(book=book) 

謝謝。