加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:37:41 所属栏目:Python 来源:网络整理
导读:我几乎可以肯定我在这里做错了什么,但我无法理解. 在我的应用程序中,Items可以存储在Workspaces中,如下所示: # models.py class Item(models.Model): name = models.CharField()class Workspace(models.Models): name = models.CharField() items = models.
我几乎可以肯定我在这里做错了什么,但我无法理解.

在我的应用程序中,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()指令之前涉及更多过滤器.
告诉我你是否需要更多数据.

谢谢您的帮助 !

解决方法

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读