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?
Вернуться на верх