python - Django ORM : filter related objects?

标签 python django

假设我有多对一的关系

class Author(model):
    name = TextField()

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

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

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

作者方面,我怎样才能只保留(对于每个作者)满足条件的书籍?例如。有没有类似的东西

Author.related_filter(book__year__gt>1800)

这会产生类似的东西

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

??

最佳答案

您可以使用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 获取过滤的相关对象的内置方法。

关于python - Django ORM : filter related objects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53090077/

相关文章:

django - 在 Django 中将计算值从 View 保存到模型

python - Django 显示前几天的数据

python - ListAPIView 中的 Django Rest Framework 序列化错误

python - "no matching architecture in universal wrapper"导入pygame时

python - 为 Django 构建自动化

Python 命令行 args 格式问题

python - Django - 在不同通用 View 中设置和访问 session 变量

django - 不将 Django Admin 与 Django Rest Framework 一起使用的原因是什么

python - 用 Pandas 拆分 DataFrame 行

Python - 有没有办法绕过 'os.listdir()' 返回错误文件夹名称的乱码?