質問

ジョイントベースにいくつかのデータがある多対多のリレーションテーブルがあります

私のモデルの基本バージョンは次のようになります:

class FooLine(models.Model):
    name = models.CharField(max_length=255)

class FooCol(models.Model):
    name = models.CharField(max_length=255)

class FooVal(models.Model):
    value = models.CharField(max_length=255)
    line = models.ForeignKey(FooLine)
    col = models.ForeignKey(FooCol)

値が存在しない場合、特定の行のすべての値をヌルで検索しようとしています(基本的に、値が入力されていないヌル値でfoovalテーブルを表示しようとしています) 典型的なSQLは次のようになります

SELECT value FROM FooCol LEFT OUTER JOIN 
  (FooVal JOIN FooLine 
  ON FooVal.line_id == FooLine.id AND FooLine.name = "FIXME") 
ON FooCol.id = col_id;

djangoモデルを使用して上記のクエリをモデル化する方法はありますか

ありがとう

役に立ちましたか?

解決

SQLには「ナビゲーション」がないため、外部結合はハックと見なすことができます。

あなたが持っているのは、単純なif文の状況です。

for line in someRangeOfLines:
    for col in someRangeOfCols:
        try:
            cell= FooVal.objects().get( col = col, line = line )
        except FooVal.DoesNotExist:
            cell= None

それが外部結合とは実際に何なのかです-NULL置換を使用したルックアップ試行です。

唯一の最適化は次のようなものです。

matrix = {}
for f in FooVal.objects().all():
    matrix[(f.line,f.col)] = f

for line in someRangeOfLines:
    for col in someRangeOfCols:
        cell= matrix.get((line,col),None)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top