2010-03-27 3 views
10

:장고 외래 키 쿼리 다음과 같은 모델에서

class header(models.Model): 
    title = models.CharField(max_length = 255) 
    created_by = models.CharField(max_length = 255) 

    def __unicode__(self): 
     return self.id() 

class criteria(models.Model): 
    details = models.CharField(max_length = 255) 
    headerid = models.ForeignKey(header) 

    def __unicode__(self): 
     return self.id() 

class options(models.Model): 
    opt_details = models.CharField(max_length = 255) 
    headerid = models.ForeignKey(header) 

    def __unicode__(self): 
     return self.id() 

나는 모든 값을 얻을 수 기준 및 옵션 테이블을 조회하려면 어떻게 Id=1, title=value-mart , createdby=CEO

같은 테이블 헤더에 대한 데이터베이스의 행이있는 경우 헤더 테이블과 관련 있음 id = 1

또한 쿼리 예제에 대한 좋은 링크를 제안 할 수 있습니다.

답변

9

처음에는 혼란 스럽기 때문에 이름에 id을 사용하지 마십시오. 해당 필드는 ID가 아니며 객체 자체입니다.

options.objects.filter(header=a_header) 

당신은 몇 가지 헤더 인스턴스가 당신이 필터링되는 값이 어떤 값처럼 쿼리 (당신이 필드 ref이있는 경우 자동으로 필드 ref_id을 만듭니다).

3

나는 coding style을 시도하고 Django 설명서에서 Models에 대해 더 자세히 보는 것과 같은 명명 규칙을 제안합니다. 이 같은 더 뭔가 :

class Header(models.Model): 
    ... 

class Criteria(models.Model): 
    details = model.CharField(max_length=255) 
    header = models.ForeignKey(Header) 

그리고는 필요에 따라 쿼리는 :

# find Criteria for a given header 
value_mart = Header.objects.get(id=1) 

# ... via an instance of Header. 
value_mart.criteria_set.all() 

# ... or with a filter(). 
Criteria.objects.filter(header=value_mart) 
Criteria.objects.filter(header_id=1) 

many-to-one relationships에 대한 문서도 usage example 참조합니다.

20

Ironfroggy가 맞지만 관련 optionscriteria 개체를 가져 오는 또 다른 명확한 방법이 있습니다. Django는 모델을 가리키는 모든 외래 키에 대해 '역방향 관계'를 자동으로 생성합니다. 일반적으로 관련 모델의 이름은 _set입니다. 그래서 :

mycriteria.options_set.all() 
mycriteria.header_set.all() 

당신에게 criteria 객체 mycriteria 관련된 모든 optionsheader 객체를 제공 할 것입니다.

또한 스타일에 관한 쪽지 : 철저한 지적에 따라 외래 키 필드에 id을 사용하지 말고 모델 클래스에 대문자로 된 스타일을 사용해야하므로 클래스 Criteria 특정 인스턴스 criteria.

링크 측면에서 Django documentation은 우수하며이 모든 것을 설명합니다.

5

Following relationships "backward"을 (를) 찾고 계시록.

당신은 당신이 필터링 기준으로 사용할 헤더 객체를 얻고, 더 자세한 정보를 원하시면

documentation

obj = Header.objects.get(title="value-mart", "createdby=CEO") 
obj.criteria_set.all() 

봐 같은 것을 사용할 수 있습니다