首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >姜戈prefetch_related

姜戈prefetch_related
EN

Stack Overflow用户
提问于 2019-11-22 16:33:31
回答 2查看 117关注 0票数 0

我有一个关系模型集,它有5个表,每个表都有一个到多个关系。在第二张表之后,我很难访问模型信息。例如。

代码语言:javascript
复制
class TableA(models.Model):
  pass

class TableB(models.Model):
  tablea = models.ForeignKey(TableA, oncascade...)

class TableC(models.Model):
  tableb = models.ForeignKey(TableB, oncas...)

class TableD(models.Model):
  tablec = models.ForeignKey(TableC, ...)

class TableE(models.Model):
  tabled = models.ForeignKey(TableE, ...)

在我的views.py中,我在TableA上使用了预取相关的方法:

代码语言:javascript
复制
from . models import *
data = TableA.objects.all().prefetch_related('tableb_set__tablec_set__tabled_set')

我似乎无法从TableC、TableD或TableE获取信息。

代码语言:javascript
复制
for a in data:
  print(a.id)
  for b in a.tableb_set.values():
    print(b['id])
    for c in b.tablec_set.values(): #This is where I get an error message stating the model doesn't have a relatedmanager

如何访问深入到2+关系中的模型信息prefetch_related表?

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-22 16:40:41

这对我有用。检查您的代码示例是否与您的源代码对齐,并且您在源代码中没有任何输入。

代码语言:javascript
复制
for a in TableA.objects.prefetch_related(
    "tableb_set__tablec_set__tabled_set__tablee_set"
):
    print(f"+ {a.id}")
    for b in a.tableb_set.all():
        print(f"+- {b.id}")
        for c in b.tablec_set.all():
            print(f"+-- {c.id}")
            for d in c.tabled_set.all():
                print(f"+--- {d.id}")
                for e in d.tablee_set.all():
                    print(f"+--- {e.id}")

for query in connection.queries:
    print(query["sql"])

# prints:

+ 1                                                                                                                                                                        
+ 2                                                                                                                                                                        
+- 2                                                                                                                                                                       
+-- 2                                                                                                                                                                      
+--- 2                                                                                                                                                                     
+--- 11                                                                                                                                                                    
+---- 3
+-- 4
+- 5
+-- 1
+--- 4
+--- 6

[...]

SELECT "main_tablea"."id" FROM "main_tablea"
SELECT "main_tableb"."id", "main_tableb"."a_id" FROM "main_tableb" WHERE "main_tableb"."a_id" IN (1, 2, 3, 4, 5)
SELECT "main_tablec"."id", "main_tablec"."tableb_id" FROM "main_tablec" WHERE "main_tablec"."tableb_id" IN (2, 5, 6, 4, 1, 3)
SELECT "main_tabled"."id", "main_tabled"."tablec_id" FROM "main_tabled" WHERE "main_tabled"."tablec_id" IN (5, 9, 2, 4, 6, 7, 1, 3, 8)
SELECT "main_tablee"."id", "main_tablee"."tabled_id" FROM "main_tablee" WHERE "main_tablee"."tabled_id" IN (4, 6, 2, 11, 3, 7, 8, 1, 10, 5, 9)
票数 0
EN

Stack Overflow用户

发布于 2019-11-22 17:09:31

使用.all()方法在_set上访问信息!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58998288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档