2013-10-12 18 views
4

我几乎可以肯定我在这里做错了什么,但我无法弄清楚。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()指令之前涉及更多的过滤器。 只需告诉我你是否需要更多数据。

谢谢你的帮助!

+1

你测试了你的示例代码吗? ...我用Django 1.5.1运行它,但不能产生你描述的问题,得到'item1 worspace:Foo,item2工作区:Foo,...',也许错误是在简化你的时候删除的行中引入的代码 – juliocesar

+0

发布代码给你的问题,而不是简化。 –

+0

谢谢你的回答。我会尽快给你提供更多信息。发布整个代码会很困难,因为应用程序很复杂(视图,模型等的多级继承)。由于Juliocesar已经对代码进行了测试,并且不能重现问题,所以它必须存在于我自己的逻辑中。我能做的就是让你访问git仓库(不要私人),但你必须设置整个项目,浏览代码等,这可能需要一些时间。我很乐意得到更近的帮助,但不要被迫做这件事。 –

回答

1

我刚刚意识到我忘了一个非常重要的元素:我为我的基本模型使用了django-polymorphic。 我已经运行som e测试并且没有多态,prefetch_related按预期工作。

我已经在Django多态性的bug跟踪系统,开设了一个问题:https://github.com/chrisglass/django_polymorphic/issues/68

我真的为这个错误道歉,我为失去你很抱歉。

相关问题