我几乎可以肯定我在这里做错了什么,但我无法弄清楚。
在我的应用程序中,项目可以存储在工作区中,如下所示:
# 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() 指令之前涉及更多过滤器。如果您需要更多数据,请告诉我。
感谢您的帮助 !