Как правильно сделать запрос к базе данных в Django ORM
Подскажите, пожалуйста, как правильно сделать запросы к базе данных, чтобы получить внуков и правнуков?
Есть следующая модель пользователя:
class CustomUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email'), unique=True, db_index=True)
full_name = models.CharField(_('ФИО'), max_length=255, blank=True, db_index=True)
is_active = models.BooleanField(_('является активным'), default=True)
father = models.ForeignKey("CustomUser", related_name='sons', blank=True, null=True, on_delete=models.CASCADE, db_index=True, verbose_name=_('отец'))
....
У каждого сына есть 1 отец. У каждого отца есть несколько сыновей. Мне нужно прописать для модели свойства для получения детей, внуков и правнуков.
С первым проблем нет:
@property
def get_children(self):
return CustomUser.objects.filter(father_id=self.id).only('id', )
А как быть с внуками и правнуками?
@property
def get_grandchildren(self):
....
@property
def get_great_grandchildren(self):
....
Можно было бы взять детей и пройтись по каждому циклом, получив внуков. Затем аналогичным образом пройтись по внукам и получить правнуков. Но я понимаю, что на каждую итерацию цикла делать запрос к БД - плохая затея.
Помогите, пожалуйста, с оптимальными запросами.