2014-03-14 34 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()'。我不确定你从'人'模特的身边*是什么意思?这*是*如何让'书'给予'人'。 –