2010-05-17 2 views
75

모델의 정수 ID를 사용하여 외래 키 관계를 설정하는 방법이 있습니까? 이것은 최적화를위한 것입니다. 예를 들어Django : 정수를 사용하여 외래 키를 설정 하시겠습니까?

, 나는 직원 모델이 있다고 가정 :

class Employee(models.Model): 
    first_name = models.CharField(max_length=100) 
    last_name = models.CharField(max_length=100) 
    type = models.ForeignKey('EmployeeType') 

EmployeeType(models.Model): 
    type = models.CharField(max_length=100) 

내가 무제한 직원의 유형을 가질 수있는 유연성을 원하는,하지만 배포 된 응용 프로그램에서 가능성 만있을 것 단일 유형 그래서 난 이드를 하드 코딩하고 이런 식으로 관계를 설정하는 방법이 있는지 궁금하네요. 이 방법을 사용하면 먼저 DB 호출을 피하여 EmployeeType 객체를 가져올 수 있습니다.

답변

171

네는 :

employee = Employee(first_name="Name", last_name="Name") 
employee.type_id = 4 
employee.save() 

ForeignKey 필드는 데이터베이스를 방문 피하기 위해 직접 액세스 할 수있는 끝에서 _id와 속성에 자신의 값을 저장합니다.

ForeignKey_id 버전은 장고 (Django)의 특히 유용한 부분으로, 적절할 때마다 알아야하며 사용하면 좋습니다.

주의 :

@RuneKaagaard는 employee.type도 (그것의 이전 값을 유지) employee.save()를 호출 한 후, 최근 장고 버전 이후에 정확하지 않은 것을 지적한다. 물론 그것을 사용하면 위의 최적화의 목적을 무효화 할 수 있지만 잘못되었다는 뜻밖의 추가 쿼리를 선호합니다. 따라서 인스턴스 작업을 마치면 (예 : employee)주의해서 사용해야합니다.

+7

문서화되어 있습니까? –

+0

[모델'.save()'] (https://github.com/django/django/blob/731f313d604a6cc141f36d8a1ba9a75790c70154/django/db/models/base.py#L708) 필드'attname' (''pre_save)''attname' 값을 반환합니다.] (https://github.com/django/django/blob/master/django/db/models/fields/__init__.py#L602)). ForeignKeys의 경우,'attname'은'_id' 접미사가 붙은 이름입니다. 또한 설정시 모델 인스턴스의 'foobar_id' 속성은 [자동으로 업데이트 됨] (https://github.com/django/django/blob/master/django/db/models/fields/related.py#L467)입니다. 'foobar'. 그러나 공식적으로 문서화 된 곳은 어디입니까? –

+5

외래 키 값을 직접 사용 : https://docs.djangoproject.com/en/1.8/topics/db/optimization/#use-foreign-key-values-directly –

28

객체를 생성하고 한 줄의 데이터베이스에 저장 create를 사용하는 다른 :이

employee = Employee.objects.create(first_name='first', last_name='last', type_id=4) 
관련 문제