2017-05-30 136 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) 

谢谢。