2014-03-14 196 views
1

我有型號:多對多關係 - Django的

class Person(models.Model): 
    name = models.TextField() 

class Book(models.Model): 
    title = models.TextField() 
    content = models.TextField() 

class Newspaper(models.Model): 
    title = models.TextField() 
    content = models.TextField() 

class Author(models.Model): 
    person = models.ForeignKey(Person,related_name="person_as_author") 
    book = models.ManyToManyField(Book,related_name="book_authors",null=True, blank=True, default=None) 
    newspaper = models.ManyToManyField(Newspaper,related_name="newspaper_authors",null=True, blank=True, default=None) 

還有人Adam。現在我需要所有書籍,adam是作者。

我嘗試這樣做:

#person is Adam 
books = [] 
person_as_authors = person.person_as_author.all() 
for each in person_as_authors: 
    books.append(each.book.get()) 

但跟它

Book matching query does not exist. 

,因爲該實例的book是無。那個例子有newspaper

我該如何過濾並獲取books列表中的書籍?

回答

3

如何:

Book.objects.filter(book_authors__person=adam).distinct() 

一般來說,如果Books你想落得什麼,你可能想與Book.objects.filter()開始查詢。有時候你可以使用一個相關的管理器(author.books.filter()),有時候你可能需要像你一樣循環(或者使用原始的SQL),但總的來說,我發現從結果反向思考它是有幫助的:「我需要的是Books,在這裏,這和這是真實的...「

+0

哇讓我試試.. – doniyor

+0

謝謝,像一個魅力工作。我如何計算來自「人」模型一側的書籍數量? – doniyor

+0

@ doniyor:爲了獲得計數,您可以在末尾放置'.count()'。我不確定你從'人'模特的身邊*是什麼意思?這*是*如何讓'書'給予'人'。 –