Prefetch_related()连接第一个项目的所有内容

时间:2013-10-12 10:13:08

标签: python django

我几乎可以肯定我在这里做错了什么,但我无法理解。

在我的应用中,Items可以存储在Workspaces中,如下所示:

# 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中,我想显示Items及其相关工作区:

# 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个不同的项目,以及一个名为“Foo”的文件夹。而不是像这样显示我的模板:

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 个答案:

答案 0 :(得分:1)

我刚刚意识到我忘记了一个非常重要的元素:我正在为我的基础模型使用django-polymorphic。 我跑了som e测试,没有多态,prefetch_related按预期工作。

我在django-polymorphic bug tracker中打开了一个问题:https://github.com/chrisglass/django_polymorphic/issues/68

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