django的高效树型数据结构
django-closuretree的Python项目详细描述
django-closuretree是为Django应用程序设计的closure tree技术的一个实现,旨在提供对关系数据库中tree-based structures的有效查询。其目标是减少查询给定对象的子对象或父对象时所需的查询数。
给定以下模型:
classNode(models.Model):name=models.CharField(max_length=24)parent=models.ForeignKey('self',related_name='children')
可以使用以下命令查询每个模型的子模型:
Node.objects.get(name='A').children.all()
但是,对于递归查找,这会导致大量查询。相反,django-closuretree允许您一次性提取它们:
fromclosuretree.modelsimportClosureModelclassNode(ClosureModel):name=models.CharField(max_length=24)parent=models.ForeignKey('self',related_name='children',null=True)a=Node.objects.create(name='A')Node.objects.create(name='B',parent=a)Node.objects.get(name='A').get_descendants()
一个查询将获得所有子代。
快速启动
- 使用pip install django-closuretree安装django-closuretree。
- 从closuretree.models.ClosureModel而不是django.db.models.Model继承模型。
就这样。现在可以在模型实例上使用get_descendants()和get_ancestors()。
如果将此添加到已经在数据库中已有数据的应用程序中,则需要在关闭树中填充现有数据:
之前,运行每个模型的^ {tt9} $方法。Node.rebuildtable()
贡献
若要贡献,请分叉回购,完成工作,然后发出拉取请求。我们要求贡献者遵守PEP8标准,并包括对其所有代码的完整测试。