【问题标题】:Prefetching returning empty values for some object为某些对象预取返回空值
【发布时间】: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


    【解决方案1】:

    尝试先按folderFile 查询集进行排序,以便每个文件夹获得不同的路径

    queryset=File.objects.order_by('folders', 'path').distinct('path')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 2012-01-16
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2019-09-30
      相关资源
      最近更新 更多