我有两种模式:
class Folder(AbstractName):
parent = models.ForeignKey('self', blank=True, null=True)
owner = models.ForeignKey(User)
typeof = models.ForeignKey(TypeParent, blank=True, null=True)
class File(AbstractName):
folder = models.ForeignKey(Folder, blank=True, null=True)
owner = models.ForeignKey(User)
typeof = models.ForeignKey(TypeChild)
我的文件夹列表(应显示文件和文件夹子项,如资源管理器文件。)会生成许多查询。
class FolderList(ListView, LoginRequiredView):
model = Folder
def get_queryset(self):
return Folder.objects.filter(owner=self.request.user, parent=None).prefetch_related('folder_set').prefetch_related('file_set')
在我的模板中:
#folder_list
{% include 'core/_folders.html' %}
#_folders
{% if object_list %}
{% for object in object_list %}
<li><a href="{% url 'folder_detail' object.pk %}">{{ object.name }}</a></li>
<ul>
{% for file in object.file_set.all %}
<li><i>{{ file }}</i></li>
{% endfor %}
{% with filename='core/_folders.html' %}
{% with object_list=object.folder_set.all %}
{% include filename %}
{% endwith %}
{% endwith %}
</ul>
{% endfor %}
</ul>
{% endif %}
感谢。 (对不起我的英语)
答案 0 :(得分:0)
第一步:安装django-debug-toolbar,以便查看触发查询的位置。
下一步:了解prefetch_related
和select_related
的工作原理。简而言之,select_related
执行JOIN查询以获取单个ForeignKey模型并将其包含在结果中。这会使执行查询的时间稍长,但如果您在迭代许多项目时速度会快得多。 prefetch_related
适用于M2M字段,JOIN可以在Python代码中使用。