Django ORM:过滤相关对象?

时间:2018-10-31 18:44:09

标签: python django

假设我有多对一关系

class Author(model):
    name = TextField()

class Book(model):
    year = IntegerField()
    author = ForeignKey(Author)

您可以轻松地从“许多”方面进行过滤。例如,只保留作者满足某些条件的书

books.objects.filter(author__name__like='...')

Author方面来看,我该如何仅保留满足条件的书(对于每位 作者)?例如。是否有类似的东西

Author.related_filter(book__year__gt>1800)

会产生类似

的东西
select * from 
author join book on ...
where book.year > 1800

??

1 个答案:

答案 0 :(得分:2)

您可以将prefetch_related与自定义Prefetch对象一起使用:

authors = Author.objects.prefetch_related(
    Prefetch('book_set', queryset=Book.objects.filter(year>1800), to_attr='modern_books')
)

for author in authors:
    for book in author.modern_books.all():
        # do stuff

这应该总共导致两个查询,所以不是您要查找的单个SQL语句,而是ORM的内置方法来获取过滤的相关对象。