2012-04-27 4 views
13

외래 키 필드 자체를 통해 외래 키의 관련 모델을 가져올 수 있습니까? 예를 들어Django 외래 키 : 관련 모델 가져 오기?

, 나는 3 개 모델이있는 경우 :

class ModelA(models.Model) 
    field1 = models.CharField(max_length=10) 

class ModelB(models.Model) 
    field1 = models.CharField(max_length=10) 

class ModelC(models.Model) 
    field1 = models.CharField(max_length=10) 
    field2 = models.ForeignKey(ModelA) 
    field3 = models.ForeignKey(ModelB) 

를하고 내가하고 싶은 :

for field in ModelC._meta.fields: 
    if field.get_internal_type() == "ForeignKey": 
     #get the related model for field e.g. ModelA or ModelB 

오히려 모델의 경우보다 단지 모델 자체를 사용하여이 가능합니까? MODELA는 "foo는"이라는 FK 필드가있는 경우

답변

19

가, 다음이 당신이 관련 모델을 얻을 수있는 방법입니다 :

for field in ModelC._meta.fields: 
    if field.get_internal_type() == "ForeignKey": 
     print field.rel.to 

경우 : 코드와

ModelA._meta.get_field('foo').rel.to 

을, 그것과 같을 것이다 오래 전에 셸에서 탭 완성을 사용하여 그것을 발견했지만 여전히 작동합니다. 당신은 그런 것들을 리버스 엔지니어링하기 위해 셸을 사용하는 법을 배울 수 있습니다.

+0

업데이트 : 새로 릴리스 된 Django 2.0에서 "rel"은 더 이상 보이지 않습니다 ForeignKey의 필드 시도해 볼 수 있습니다 :'ModelA._meta.get_field ('foo'). related_model'. 명령 줄에서 자동 완성되도록 "탭"을 입력하여이 사실을 알 수 있습니다. –

0

이와 같은 관계를 추출하려고 할 때 나는 많은 명령 행 실험을 사용합니다. 내가 사용하는 일반적인 패턴은 _=starting_point.<chained_attributes>;pprint((_, dir(_)))입니다. 예를 들어 :

_=ModelC;pprint((_, dir(_))) 
_=ModelC.field2;pprint((_, dir(_))) 
_=ModelC.field2.field;pprint((_, dir(_))) 
_=ModelC.field2.field.rel;pprint((_, dir(_))) 
_=ModelC.field2.field.rel.to;pprint((_, dir(_))) 

는 (당신은 자연스럽게, from pprint import pprint 먼저 수행해야합니다.) 그 날 내가 원하는 항목을 찾아내는 때까지/추가 속성을 제거하는 실험을 할 수 있습니다 ... 명확하게 보는 것은 내가 가지고 무엇을하면서 다음 레벨에서 사용할 수있는 것은 무엇입니까? 이것에서 나는 ModelC.field2.field.rel.to == ModelA을 얻는다. 동일한 기초 패턴을 사용하여 클래스가 아닌 인스턴스로 시작하는 역 관계, 다 대다 관계를 탐색 할 수 있습니다.