2016-08-03 19 views
0

3つのテーブルを結合する(A、B、C)と私はそうのようにそれらを結合する必要があります。ジャンゴORM私は三つのモデルを持っている

モデルモデルC.

にBのPK1をモデル化するためにFK1、その後、モデルBのFK1を

テーブルを結合していますが、正しく結合していません。モデルaからbに参加することはできますが、最初の結合後に最後のテーブル(c)からフィールドを引き出すことはできません。

作品

サンプルSQL:

select a.field1, a.field2, b.char1, b.char2, c.var1, c.var2 
from TableA a 
inner join TableB b 
    on a.field1 = b.char1 
left join TableC c 
    on b.char2 = c.var1 
where a.field2 = 'number' 

のDjangoコード:

TableA.objects.select_related('field1').filter(field2=var).prefetch_related('char1').values('field1', 'field2', 'char1', 'char1__var1', 'char1__var2') 

Djangoのmodels.py:

class TableA(models.Model): 
field2 = models.CharField(db_column='FIELD2', max_length=8, primary_key=True) # Field name made lowercase. 
field1 = models.ForeignKey('TableB', db_column='FIELD1', max_length=6) # Field name made lowercase. 

class Meta: 
    managed = False 
    db_table = 'TableA' 

class TableB(models.Model): 

char1 = models.CharField(db_column='CHAR1', max_length=6) # Field name made lowercase. 
char2 = models.ForeignKey('TableC', db_column='CHAR2', max_length=6, primary_key=True) # Field name made lowercase. 

class Meta: 
    managed = False 
    db_table = 'TableB' 

class TableC(models.Model): 

var1 = models.CharField(db_column='VAR1', max_length=6, primary_key=True) # Field name made lowercase. 
var2 = models.CharField(db_column='VAR2', max_length=50) # Field name made lowercase. 

class Meta: 
    managed = False 
    db_table = 'TableC' 

答えて

0

が更新:質問が編集されたが、ので、この答えはもう関連性がありません。

TableA.objects.filter(field2=var, b__isnull=False, b__c__isnull=True).values(
    'field1', 'field2', 'b__char1', 'b__c__var1', 'b__c__var2', 
) 
  1. b__isnull=FalseINNER JOIN tablebのためのものであり、b__c__isnull=TrueLEFT JOIN tablecためです。
  2. 関連モデルのフィールドはvalues()で参照できます。
+0

「キーワード 'テーブル'をフィールドに解決できません」(特にTableB) – Zorpho

+1

@Zorphoモデルを表示できますか? – vd1

+0

元の質問をモデルで更新し、やりたいSQLを修正しました。最初の表は表Bのfkからpkを持ち、表Bの別のフィールドは表Cのfkから項目を持っています。 – Zorpho

関連する問題