2010-11-19 3 views
1

둘 중 하나에서 고유하지 않은 열로 두 모델을 결합하고 싶습니다. 외래 키 필드를 사용django에서 고유하지 않은 두 개의 열에 어떻게 가입합니까?

class Ctystate(models.Model): 
    ctystate_id = models.IntegerField(primary_key=True) 
    zip5 = models.IntegerField() 
    [...] 

class Addr2zip(models.Model): 
    addr2zip_id = models.IntegerField(primary_key=True) 
    ctystate = models.ForeignKey(Ctystate, db_column='zip5', to_field='zip5') 
    zip5 = models.IntegerField() 
    [...] 

단지 모델 유효성 검사 오류가 발생합니다

Field 'zip5' under model 'Addr2zip' must have a unique=True constraint.

내가 모두에서 'zip5'필드를 사용하여이 두 모델에 참여할 수있는 방법이 있나요? 결과에 중복이 생길 수는 있지만 필터에 사용될 다른 보호 장치가 있다는 것을 알고 있습니다.

나는 또한 중간 테이블을 갖고 싶지 않습니다. 해야만한다면, 나는 내 자신의 SQL을 작성할 수 있지만 가능한 한 ORM을 고수하려고한다. 감사.

+1

두 모델 모두에서 왜 'zip5'입니까? 그들 사이에 realtion이 있다면, 모든'Ðddr2zip' 객체에 대해'zip5'를 얻는 것이 쉽습니다. 게다가 필요가 없다면 항상 주키를 만능으로 정의하는 것이 이치에 맞지 않는다고 생각합니다. 'zip5'가'Ctystate' 모델에서 유일하다면 기본 키로 사용할 수도 있습니다. 그래서 외래 키가 자동으로 표현됩니다! –

+0

zip5는이 데이터 집합에서 이와 같은 방식으로 제공되며 이는이 목적을 위해이 두 데이터를 관련시키기 위해 수행하고있는 작업입니다. 데이터 구조를 변경하는 것이 옵션이 아니라면 어떻게 장고 모델로이 작업을 수행할까요? –

답변

1

미국의 한 우편 번호는 도시를 1 개 이상 포함 할 수 있습니다. 도시에는 반드시> 1 우편 번호가있을 수 있으므로 ManyToMany 관계가 필요합니다.

또한 우편 번호는 주 경계를 넘을 수 있으며 주 경계선을 통과하는 도시 (예 : Kansas City)가 있지만 공식적으로 각 시정촌은 하나의 주에만 속합니다.

데이터 모델은이 해석 방법에 따라 달라집니다.

대부분의 경우 합리적인 모델로 조인을 실행할 필요가 없습니다. 당신은 변경없이 모델을 유지하려는의 (당신이 실제 테이블 이름을 확인해야합니다)하지만이 같은

뭔가 작동 할 수 있습니다 :

addr_list = Ctystate.objects.extra(
    select = { 
     'city_name': 'ctystate.name', 
     'addr': 'addr2zip.address' 
    }, 
    where = ['ctystate.zip5 = addr2zip.zip5'], 
    tables = ['ctystate', 'addr2zip']#assuming that those are names in your table 
) 
+0

나는이 문제점을 알고있다. 그러나 이것은 기존 데이터 세트를위한 것이며, 이것이 두 테이블을 연관시키는 방법입니다. –

+0

글쎄, 나는 불쾌한 쿼리를 작성하기보다는 오히려 데이터를 새 테이블로 마이그레이션하는 편이 낫다고 생각한다. 그러나 extra() 절을 사용하면 그렇게 할 수 있습니다. 나는이 calse에서 extra() 호출을 피할 수있는 방법이 없다고 생각한다. – Evgeny

+0

.extra (tables = [])의 예를 어디에서 얻을 수 있는지 알고 계십니까? 워드 프로세서는 하나도주지 않습니다 (매우 잘 설명하지도 않음). 물론 그 두 개의 간단한 단어는 Google에서도 백만 건의 관련이없는 항목을 반환합니다. –

0

을 당신이 이런 식으로 해결할 수 있어야한다고 생각합니다 : 당신이 그런 식으로 그것을 할 것입니다 경우

class Ctystate(models.Model): 
    ctystate_id = models.IntegerField(primary_key=True) 
    zip5 = models.IntegerField(unique=True) 

class Addr2zip(models.Model): 
    addr2zip_id = models.IntegerField(primary_key=True) 
    ctystate = models.ForeignKey(Ctystate, db_column='zip5', to_field='zip5') 

ForeignKeyctystatezip5라는 DB 컬럼에 zip5의 값으로 표현됩니다. 외래 키를 사용하려면 to_fieldunique=True으로 설정해야합니다. 그렇지 않으면 더 이상 1 : n (외래 키) 관계가 아니기 때문입니다 (모든 Addr2zip 개체는 두 개 이상의 Ctystate 개체와 관련 될 수 있습니다. am : n relation - 필요하다면 ManyToManyField!를 사용하여 해결해야합니다!).

+0

원래 게시물을 참조하십시오. 이런 식으로 ForeignKey()를 사용하면 ctystate의 zip5가 고유하지 않기 때문에 오류가 발생합니다. ManyToMany는 중급 테이블을 갖고 싶지 않기 때문에 내가 원하는 것에 대해서는 작동하지 않습니다. 어쨌든 고마워. –

관련 문제