我的目标是使用
prefetch_related
在一个 Django 查询中获取我的所有模型和相关模型,从而在迭代相关模型时不会访问数据库。
假设我有以下图书馆模型,其中有许多书籍和许多页面。
from django.db import models
class Library(models.Model):
name = models.CharField(max_length=50)
class Book(models.Model):
title = models.CharField(max_length=50)
genre = models.CharField(max_length=50)
library = models.ForeignKey(Library, on_delete=models.CASCADE)
class Page(models.Model):
content = models.TextField()
book = models.ForeignKey(Book, on_delete=models.CASCADE)
我知道我可以通过
models.Library.objects.prefetch_related('book_set__page_set')
一次性完成所有事情,但如果我想限制通过 genre='fantasy'
预订怎么办?如何在我的关系跨越预取查询中添加此过滤条件?
补充 @themanatuf 答案,该答案缺少相关页面模型的预取。下面的查询代码将预取所有图书馆模型及其相关书籍和页面,但仅限于书籍类型='幻想':
pf_queryset = models.Book.objects.filter(genre="fantasy").prefetch_related("page_set")
pf = Prefetch("book_set", queryset=pf_queryset)
models.Library.objects.prefetch_related(pf).all()
您需要按照此处的说明进行操作:
https://docs.djangoproject.com/en/2.2/ref/models/querysets/#prefetch-objects
基本上你会做这样的事情
books_query = Books.objects.filter(genre="fantasy")
pf = Prefetch("book_set", queryset=books_query)
Library.objects.prefetch_related(pf).get().book_set.all()