2016-08-03 3 views
0

세 개의 테이블을 조인 (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' 

장고 코드 :

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

장고의 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

관련 문제