如何在 Django 中跨多个一对多关系使用 prefetch_lated?

问题描述 投票:0回答:2

我的目标是使用

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'
预订怎么办?如何在我的关系跨越预取查询中添加此过滤条件?

python django one-to-many prefetch
2个回答
3
投票

补充 @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()

2
投票

您需要按照此处的说明进行操作:

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()
© www.soinside.com 2019 - 2024. All rights reserved.