Django orm: Как аннотировать модель связанным отношением, проходящим через несколько таблиц
Допустим, у меня есть такая структура
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)
Есть ли способ аннотировать экземпляры lvlOne с Related Manger lvlThree, я думаю о чем-то подобном
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 мне удалось получить похожий результат, но это все еще список идентификаторов (или имен и т.д.), а не реальных объектов.
- Использование Prefetch() и FilteredRelation(), похоже, применяется только к непосредственному отношению, каждый раз, когда поиск переходит к другой Модели, предварительной выборки не происходит.
Я могу поделиться некоторыми моментами из своего опыта.
-
Полезно
- выполнять
Subquery
внутриannotate
. Стоит заметить, чтоannotate
требует, чтобы возвратом было одно значение, а не список значений или объект .
- А что если начать с
lvlThree
и аннотировать связанные с нимlvlOne
?