我使用这个mixin在视图上应用prefetch_related。这就是我要处理的查询集:
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()
但是,当我尝试迭代模板中的相关对象时:
{% for p in object.projects %}
<li>{{ p.name }}</li>
{% empty %}
<li>No Projects in this Workspace</li>
{% endfor %}
我得到了这个错误:
'RelatedManager' object is not iterable
在mixin中是否有什么东西改变了对象,使其返回一个RelatedManager?
提前感谢!
发布于 2012-10-26 11:45:10
prefetch_related是RelatedManager,需要执行method才能得到结果:
在文档示例中:
>>> pizzas = Pizza.objects.prefetch_related('toppings')
>>> [list(pizza.toppings.filter(spicy=True)) for pizza in pizzas]
对于您的场景:
{% for p in object.projects.all %}
发布于 2012-10-26 17:49:03
@danihp有:你需要.all
。
这里还有一个错误:
return queryset.prefetch_related(
", ".join(self.prefetch_related)
)
应该阅读
return queryset.prefetch_related(*self.prefetch_related)
prefetch_related
接受多个字符串参数,而不是单个逗号分隔的字符串。
https://stackoverflow.com/questions/13086278
复制