2014-01-27 18 views
0

我有两个型号:Prefetch_related和我的模型

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

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

下一步:了解prefetch_relatedselect_related的工作方式。简而言之,select_related执行JOIN查询来获取单个ForeignKey模型并将其包含在结果中。这会提供稍长的执行查询,但如果您正在迭代多个项目,则速度会更快。 prefetch_related将适用于M2M领域,并在Python代码中执行JOIN工作。

+0

嗨,ddt is alreay installed。但是,我的select_related不起作用(模型在select_related或model_set?)谢谢。 – user3216336

+0

@ user3216336我认为你正在寻找'.select_related('file')',但你应该检查后向关系是否如此工作,因为从技术上讲它是一对多而非一对一的。 –

+0

是的,没错!我迷路了,你能指导我吗?谢谢! – user3216336

相关问题