我几乎可以肯定我在这里做错了什么,但我无法理解。
在我的应用中,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()指令之前涉及更多过滤器。 只需告诉我您是否需要更多数据。
感谢您的帮助!
答案 0 :(得分:1)
我刚刚意识到我忘记了一个非常重要的元素:我正在为我的基础模型使用django-polymorphic。
我跑了som
e测试,没有多态,prefetch_related
按预期工作。
我在django-polymorphic bug tracker中打开了一个问题:https://github.com/chrisglass/django_polymorphic/issues/68
我真的为这个错误道歉,我很抱歉失去你的时间。