我将尝试使用闭包表来建模组织成分层树形结构的数据,这些条目将代表树中的节点,它们并不复杂,定义如下。
class Region(models.Model):
RegionGuid = models.CharField(max_length=40, unique=True, db_column='RegionGUID', blank=True)
CustomerId = models.IntegerField(null=True, db_column='CustomerID', blank=True)
RegionName = models.CharField(max_length=256, db_column='RegionName', blank=True)
Description = models.TextField(db_column="Description", blank=True)
class Meta:
db_table = u'Region'
节点之间的路径是使用以下闭包表定义的。 它包含指向祖先节点的FK、指向后代节点的FK以及祖先和后代之间的路径长度(即节点数量):
class RegionPath(models.Model):
Ancestor = models.ForeignKey(Region, null=True, db_column='Ancestor', blank=True)
Descendant = models.ForeignKey(Region, null=True, db_column='Descendant', blank=True)
PathLength = models.IntegerField(null=True, db_column='PathLength', blank=True)
class Meta:
db_table = u'RegionPath'
现在我该如何检索所有的Region
行及其相应的父节点(即RegionPath.PathLength = 1
)?我的SQL语言有些生疏,但我认为SQL查询应该类似于以下内容。
SELECT r.* from Region as r
LEFT JOIN
(SELECT r2.RegionName, p.Ancestor, p.Descendant from Region as r2 INNER JOIN RegionPath as p on r2.id = p.Ancestor WHERE p.PathLength = 1) AS Parent
on r.id = Parent.Descendant
如果能够使用Django的QuerySet API来表达这个问题,将不胜感激。