2012-05-16 2 views
13

새 모델을 만들 때 외래 키에 대한 모델 인스턴스를 전달할 필요가없는 방법이 있습니까? 이 전 다음과 같은 모델을 가지고 있다고 가정 해 봅시다 :Django ForeignKey 인스턴스 대 Raw ID

class Foo(models.Model): 
    description = models.CharField(max_length=100) 

    class Meta: 
     db_table = u'foo' 

class Bar(models.Model): 
    info = models.CharField(max_length=100) 
    foo = models.ForeignKey('Foo') 

    class Meta: 
     db_table = u'bar' 

후자 POST 요청은보기에 온다 - 나는 foo는 레코드의 ID를 알고 바로 바 테이블에 레코드를 삽입 할.

내가 할 경우 : ":"

new_bar = Bar(info="something important", foo=foo_id) 
new_bar.save() 

은 내가 ValueError를 말하는 546456487466L "를 할당 할 수 없습니다"얻을. Bar.foo는 "단지 수는"푸 "인스턴스를

을 그래서, 나는 그것을 얻을. .. 나는 Foo 모델의 실제 인스턴스를 갖기를 원한다. 나는 Foo에 접근하여 전달할 수 있다는 것을 이해한다. 그러나이 기능을 오버라이드 할 수있는 방법이 있어야 할 것 같다. 일부 인터넷 검색 및 문서를 읽고 raw_id_fields in admin이 기본 아이디어 인 것 같습니다. (즉, 여기에 원시 ID를 허용합니다.) 그러나 ForeignKey 필드에는이 옵션이 표시되지 않습니다.

개체를 가져 와서 이미 가지고있는 ID를 얻으려면 데이터베이스를 왕복해야하는 것은 매우 비효율적 인 것처럼 보입니다. 왕복 여행을하다 보면 ID가 데이터베이스에 있는지 확인합니다. 하지만, 어이 ... 그 이유는 내가 RDBMS를 사용하고 첫 번째 장소에서 외래 키가 있습니다.

감사

+0

멋진 고전적인 질문입니다. – trpt4him

답변

20
new_bar = Bar(info="something important", foo_id=12345) 
new_bar.save() 

또한 foreign key values directly를 얻을 수 있습니다. 어떤 종류의 최적화.

+0

이것은 효과가있었습니다 ... 내가 뭔가를 알아낼 때까지 여전히 문제가있었습니다. 1 개의 작은 노트를 여기에 추가하고 위의 대답을 편집하려고합니다. 위의 예에서 실제로 조금 더 단순화되었습니다. REAL 모델에서 테이블의 기본 키 "foo"는 "id"가 아니 었습니다. 그리고 외국인은 "foo_id"가 아니 었습니다. 하지만 작동하려면 필드 이름 + "_ id"를 사용해야합니다. –

+1

id가 Foo의 필드이기 때문에 이중 언더 스코어가 아니라는 것이 이상하지 않습니까? 적어도 쿼리 세트에서는 두 개의 밑줄을 사용합니다. – radtek

+0

@radtek 당신이 Foo의 id 필드를 사용하고 있지 않기 때문에 Bar의 foo_id 필드를 사용하고 있습니다. 일종의 데이터베이스 클라이언트를 사용한다면'appname_foo'는'id' 컬럼을 가지며'appname_bar'는'foo_id' 컬럼을가집니다. 그렇지 않다면 Foo가 각 Bar에가는 것을 어떻게 알 수 있습니까? 따라서이 경우에도 querysets에서조차도 id를 다룰 때 두 개의 밑줄을 사용하지 않아야합니다. (그런 식으로 조인하지 마십시오). – semicolon

관련 문제