繁体   English   中英

Django orm:如何使用遍历多个表的相关关系注释模型

[英]Django orm: How to annotate a model with a related relation traversing multiple table

可以说我有这个结构

class lvlOne(models.Model):
    name = models.CharField(max_length=255)


class lvlTwo(models.Model):
    name = models.CharField(max_length=255)
    parent = models.ForeignKey(lvlOne, related_name="children")


class lvlThree(models.Model):
    name = models.CharField(max_length=255)
    parent = models.ForeignKey(lvlTwo)

有没有办法用 lvlThree 的相关管理器注释 lvlOne 的实例,我在想这样的事情

obj = lvlOne.objects.annotate(grandchildren = .... ).get()

obj.children.all() # all related lvlTwo instances as expected from setting related_name 
obj.grandchildren.all() # all related lvlThree instances

我尝试过的几件事

  • 使用 postgres 特定的 ArrayAGG我设法得到了类似的结果,但它仍然是一个 id (或名称等)列表而不是实际对象。
  • 使用Prefetch()FilteredRelation()似乎仅适用于即时关系,每次查找遍历到另一个模型时,都不会发生预取。

我可以根据我的经验分享一些观点。

  • annotate中做Subquery很有帮助。 值得注意的是, annotate要求返回是单个值,而不是值列表或对象
  • lvlThree开始并注释相关lvlOne怎么样?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM