В Django у меня есть модель Checkout, которая является билетом для тех, кто проверяет оборудование. У меня также есть модель OrganizationalUnit, к которой относится модель Checkout (через ForeignKey), так как человек на кассе принадлежит к OrganizationalUnit в нашем кампусе.
OrganizationalUnit имеет отношение к себе, поэтому несколько OU могут быть детьми определенного OU, и эти дети могут иметь детей и так далее. Вот модели, несколько упрощенные.
class OrganizationalUnit(models.Model):
name = models.CharField(max_length=100)
parent = models.ForeignKey(
'self',
blank=True, null=True,
related_name='children',
)
class Checkout(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
department = models.ForeignKey(
OrganizationalUnit,
null=True,
blank=True,
related_name='checkouts',
)
Я хочу получить количество проверок, связанных с определенным организационным подразделением и всеми его дочерними элементами. Я знаю, как получить количество всех проверок, связанных с подразделением.
ou = OrganizationalUnit.objects.get(pk=1)
count = ou.checkouts.all().count()
Но как мне сделать так, чтобы этот счет отражал проверки детей этого подразделения и их детей? Я использую какой-то итерационный цикл?
РЕДАКТИРОВАТЬ : Полагаю, я все еще не могу обернуть голову вокруг команды while, чтобы сделать это. Подразделения могут заходить так глубоко, как пользователь хочет их вкладывать, но сейчас самое большее в базе данных - 5. Я написал это ...
for kid in ou.children.all():
child_checkout_count += kid.checkouts.all().count()
for kid2 in kid.children.all():
child_checkout_count += kid2.checkouts.all().count()
for kid3 in kid2.children.all():
child_checkout_count += kid3.checkouts.all().count()
for kid4 in kid3.children.all():
child_checkout_count += kid4.checkouts.all().count()
for kid5 in kid4.children.all():
child_checkout_count += kid5.checkouts.all().count()
... это полная чушь. И для запуска требуется некоторое время, потому что он в значительной степени пересекает основную часть базы данных. Помогите! (Кажется, я не очень хорошо думаю сегодня.)