Prefetch_related和我的模型

时间:2014-01-27 21:02:07

标签: python django

我有两种模式:

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 %}

感谢。 (对不起我的英语)

1 个答案:

答案 0 :(得分:0)

第一步:安装django-debug-toolbar,以便查看触发查询的位置。

下一步:了解prefetch_relatedselect_related的工作原理。简而言之,select_related执行JOIN查询以获取单个ForeignKey模型并将其包含在结果中。这会使执行查询的时间稍长,但如果您在迭代许多项目时速度会快得多。 prefetch_related适用于M2M字段,JOIN可以在Python代码中使用。