2012-10-26 45 views
0

我有这个mixin在视图上应用prefetch_related。这是我应该是工作的查询集:Django prefetch_related在通用视图DetailView

MyMode.objects.all().prefetch_related('projects') 

有这些模特:

class Workspace(): 
name = models.CharField(max_length=255) 
class Project(): 
name = models.CharField(max_length=255) 
workspace = models.Foreignkey(Workspace) 

与此混入我创建:

class PrefetchRelatedMixin(object): 
    prefetch_related = None 

    def get_queryset(self): 
     if self.prefetch_related is None: 
      raise ImproperlyConfigured(u'%(cls)s is missing the prefetch_related' 
       "property. This must be a tuple or list." % { 
       'cls': self.__class__.__name__}) 

     if not isinstance(self.prefetch_related, (tuple, list)): 
      raise ImproperlyConfigured(u"%(cls)s's select_related property " 
       "must be a tuple or list." % {"cls": self.__class__.__name__}) 

     queryset = super(PrefetchRelatedMixin, self).get_queryset() 

     return queryset.prefetch_related(
      ", ".join(self.prefetch_related) 
     ) 

叫这样的观点:

class WorkspaceView(DetailView): 
    prefetch_related = ['projects'] 
    model = Workspace 

    def get_queryset(self): 
     return super(WorkspaceView, self).get_queryset() 

H H但是,当我尝试遍历相关对象在我的模板:

{% for p in object.projects %} 
    <li>{{ p.name }}</li> 
{% empty %} 
    <li>No Projects in this Workspace</li> 
{% endfor %} 

我得到这个错误:

'RelatedManager' object is not iterable 

有什么在改变了对象上,要返回的混入RelatedManager?

在此先感谢!

回答

1

prefetch_related是RelatedManager,您应该执行方法得到的结果:

在文档样本:

>>> pizzas = Pizza.objects.prefetch_related('toppings') 
>>> [list(pizza.toppings.filter(spicy=True)) for pizza in pizzas] 

对于您的情况:

{% for p in object.projects.all %} 
+0

如果给定相同的模型/视图上下文,这将如何与ManyToMany关系一起工作? –

1

@danihp有它:你需要.all

还有这里的错误:

return queryset.prefetch_related(
      ", ".join(self.prefetch_related) 
     ) 

应改为

return queryset.prefetch_related(*self.prefetch_related) 

prefetch_related需要多个字符串参数,而不是一个逗号分隔的字符串。