【发布时间】:2020-04-18 23:24:21
【问题描述】:
假设这两个模型。
class Folder(model):
name = models.CharField(max_length=8)
files = models.ManyToManyField('File')
class File:
path = models.CharField(max_length=255)
首先,我获取文件夹,并在遍历它们的同时获取具有不同路径的文件
folders = Folder.objects.all()
for folder in folders:
files_with_distinct_path = folder.files.distinct('path').order_by('path')
但这会遇到 N+1 问题,所以我尝试在获取所有文件夹的同时预取文件。
from django.db.models import Prefetch
folders = Folder.objects.prefetch_related(
Prefetch(
'files', queryset=File.objects.distinct('path').order_by('path'), to_attr='distinct_files'
)
)
但现在发现有空distinct_files 的对象不是正确的结果,这些对象有文件但在预取后结果只有少数对象是空的。
【问题讨论】:
标签: python django django-models django-queryset django-database