我几乎可以肯定我在这里做错了什么,但我无法弄清楚。Prefetch_related()加入所有的第一项
在我的应用程序,物品可以存放在工作区,如下所示:
# models.py
class Item(models.Model):
name = models.CharField()
class Workspace(models.Models):
name = models.CharField()
items = models.ManyToManyField(
Item,
related_name="workspaces",
null=True,
blank=True,
default=None)
然后,在我的ListView,我想显示项目及其相关的工作区:
# views.py
class ListItems(ListView):
model = Items
template_name = "list_items.html"
def get_queryset(self):
return self.model.objects.all().prefetch_related('workspaces')
的错误发生在我的模板中:
# list_items.html
{% for object in object_list %}
{{ object.name }}
Workspaces :
{% for workspace in object.workspaces.all %}
{{ workspace.name }}
{% empty %}
No workspaces
{% endfor %}
{% endfor %}
比方说,我有10个不同的项目和一个名为“F OO”。而不是显示像这样我的模板:
Item1
workspaces: Foo
Item2
workspaces: Foo
Item3
workspaces: Foo
#etc...
我得到以下输出:
Item1
workspaces: Foo Foo Foo Foo Foo Foo Foo Foo Foo Foo # 1 Foo per item in list
Item2
workspaces: No workspaces
Item3
workspaces: No workspaces
#etc...
好像prefetch_related()所有工作区在列表中的第一项关联。 如果我删除了get_queryset()的prefetch_related()部分,我得到了正确的输出,但它需要更多的查询。
我在这里做错了什么?
我的应用程序要复杂得多,所以也许我把它简化得太多了。特别是,我的get_queryset()方法在prefetch_related()指令之前涉及更多的过滤器。 只需告诉我你是否需要更多数据。
谢谢你的帮助!
你测试了你的示例代码吗? ...我用Django 1.5.1运行它,但不能产生你描述的问题,得到'item1 worspace:Foo,item2工作区:Foo,...',也许错误是在简化你的时候删除的行中引入的代码 – juliocesar
发布代码给你的问题,而不是简化。 –
谢谢你的回答。我会尽快给你提供更多信息。发布整个代码会很困难,因为应用程序很复杂(视图,模型等的多级继承)。由于Juliocesar已经对代码进行了测试,并且不能重现问题,所以它必须存在于我自己的逻辑中。我能做的就是让你访问git仓库(不要私人),但你必须设置整个项目,浏览代码等,这可能需要一些时间。我很乐意得到更近的帮助,但不要被迫做这件事。 –