python – 如何获得模型相关对象和模型子项相关对象的总计数?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 如何获得模型相关对象和模型子项相关对象的总计数?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2841字,纯文字阅读大概需要5分钟。
内容图文
![python – 如何获得模型相关对象和模型子项相关对象的总计数?](/upload/InfoBanner/zyjiaocheng/729/f2ae2b7975734976820cc4bd578aeae9.jpg)
在Django,我有一个Checkout模型,这是一个检查设备的人的票.我还有一个Checkout模型与(通过ForeignKey)相关的OrganizationalUnit模型,因为结账时的人属于我们校园的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及其所有孩子有关的Checkout.我知道如何获得与OU相关的所有结账的计数.
ou = OrganizationalUnit.objects.get(pk=1)
count = ou.checkouts.all().count()
但是,如何计算这个OU的孩子和他们的孩子的结账?我是否使用某种迭代循环?
编辑:我想我仍然不能完全围绕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()
……总废话.它需要一段时间才能运行,因为它几乎遍历了数据库的主要部分.救命! (我今天似乎无法想得很好.)
解决方法:
我认为最有效的计算方法是在写入时.您应该像这样修改OrganizationalUnit:
class OrganizationalUnit(models.Model):
name = models.CharField(max_length=100)
parent = models.ForeignKey(
'self',
blank=True, null=True,
related_name='children',
)
checkout_number = models.IntegerField(default=0)
创建将在写入时更新OrganizationalUnit及其父项的函数:
def pre_save_checkout(sender, instance, **kwargs):
if isinstance(instance,Checkout) and instance.id and instance.department:
substract_checkout(instance.department)
def post_save_checkout(sender, instance, **kwargs):
if isinstance(instance,Checkout) and instance.department:
add_checkout(instance.department)
def substract_checkout(organizational_unit):
organizational_unit.checkout_number-=1
organizational_unit.save()
if organizational_unit.parent:
substract_checkout(organizational_unit.parent)
def add_checkout(organizational_unit):
organizational_unit.checkout_number+=1
organizational_unit.save()
if organizational_unit.parent:
add_checkout(organizational_unit.parent)
现在您只需要将这些函数连接到pre_save,post_save和pre_delete信号:
from django.db.models.signals import post_save, pre_save, pre_delete
pre_save.connect(pre_save_checkout, Checkout)
pre_delete.connect(pre_save_checkout, Checkout)
post_save.connect(post_save_checkout, Checkout)
应该这样做……
内容总结
以上是互联网集市为您收集整理的python – 如何获得模型相关对象和模型子项相关对象的总计数?全部内容,希望文章能够帮你解决python – 如何获得模型相关对象和模型子项相关对象的总计数?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。