4

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

在我的应用程序中,项目可以存储在工作区中,如下所示:

# 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 个不同的项目,以及一个名为“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() 指令之前涉及更多过滤器。如果您需要更多数据,请告诉我。

感谢您的帮助 !

4

1 回答 1

1

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

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

我真的为那个错误道歉,也很抱歉浪费了你的时间。

于 2014-02-21T11:10:24.570 回答