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',
)
特定のOrganizationalUnitとそのすべての子に関連するチェックアウトの数を取得したいと思います。OUに関連するすべてのチェックアウトの数を取得する方法を知っています。
ou = OrganizationalUnit.objects.get(pk=1)
count = ou.checkouts.all().count()
しかし、このカウントにこのOUの子とその子のチェックアウトを反映させるにはどうすればよいですか?ある種の反復ループを使用しますか?
編集:これを行うためのwhileコマンドに頭を包むことはまだできないと思います。組織単位は、ユーザーがネストしたいだけ深くすることができますが、現在、DBで最も深くなるのは5です。私はこれを書きました…</p>
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()
…これは完全ながらくたです。また、データベースの主要なチャンクをほぼ通過するため、実行には時間がかかります。ヘルプ!(今日はよく考えられないようです。)