2016-08-03 38 views
0

我有三個型號(A,B,C)和我需要加入他們的行列,像這樣:Django的ORM加入三個表

模型模型B PK1一個FK1然後B型fk1至型號C.

它正在連接表,但沒有正確連接它們。我可以加入模型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 tablebb__c__isnull=TrueLEFT JOIN tablec
  2. 您可以參考values()中相關型號的字段。
+0

它說「無法解析關鍵字」表'字段「(特別是表B) – Zorpho

+1

@Zorpho你可以顯示模型? – vd1

+0

我更新了模型的原始問題,並修改了我試圖做的sql。第一個表在表B中具有fk到pk,然後表B中的不同字段對錶C中的字段具有fk。 – Zorpho