6

クロージャ テーブルを使用して、階層ツリーとして編成されたデータをモデル化しようとしています。ツリー内のノードを表すエントリは特別なものではなく、次のように定義されています。

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 を使用してこれを表現するための助けをいただければ幸いです。

4

1 に答える 1