【发布时间】:2011-01-10 04:11:32
【问题描述】:
在 Django 中,我有一个 Checkout 模型,它是某人检查设备的票。我还有一个与结帐模型相关的组织单元模型(通过 ForeignKey),因为结帐的人属于我们校园的一个组织单元。
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 相关的所有结帐的计数。
ou = OrganizationalUnit.objects.get(pk=1)
count = ou.checkouts.all().count()
但是如何使该计数反映此 OU 的子项及其子项的结帐?我是否使用某种迭代循环?
编辑:我想我仍然无法完全理解 while 命令来执行此操作。组织单元可以嵌套到用户想要嵌套的深度,但现在它在 DB 中的深度最多为 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()
……这完全是废话。而且它需要一段时间才能运行,因为它几乎遍历了数据库的主要部分。帮助! (我今天好像不能好好思考。)
【问题讨论】:
标签: python django many-to-many models django-select-related