假设这两个模型。
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
为空的对象,这不是正确的结果,这些对象具有文件,但是在预取之后,结果仅对少数几个对象为空。
File
排序folder
查询集,以便每个文件夹获得不同的路径queryset=File.objects.order_by('folders', 'path').distinct('path')