クロージャ テーブルを使用して、階層ツリーとして編成されたデータをモデル化しようとしています。ツリー内のノードを表すエントリは特別なものではなく、次のように定義されています。
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 を使用してこれを表現するための助けをいただければ幸いです。