Django : 정수를 사용하여 외래 키 설정?


104

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

예를 들어 Employee 모델이 있다고 가정합니다.

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)

직원 유형을 무제한으로 가질 수있는 유연성을 원하지만 배포 된 응용 프로그램에는 단일 유형 만있을 가능성이 있으므로 ID를 하드 코딩하고 이러한 방식으로 관계를 설정하는 방법이 있는지 궁금합니다. 이렇게하면 EmployeeType 개체를 먼저 가져 오는 db 호출을 피할 수 있습니다.

답변:


205

네:

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

ForeignKey필드 _id는 끝에 있는 속성에 값을 저장 하므로 데이터베이스를 방문하지 않도록 직접 액세스 할 수 있습니다.

_id(A)의 버전은 ForeignKey모든 사람이 알고 수시로 사용하는 경우에 해당한다 장고, 하나의 특히 유용한 측면이다.

경고:

@RuneKaagaard employee.type는 호출 후에도 최근 Django 버전에서 정확하지 않다고 지적합니다 employee.save()(이전 값을 유지합니다). 물론이를 사용하면 위의 최적화 목적이 무효화 될 수 있지만 잘못된 것보다 우발적 인 추가 쿼리를 선호합니다. 따라서 조심하십시오. 인스턴스 작업을 마쳤을 때만 사용하십시오 (예 :) employee.


10
문서화되어 있습니까?
Scott Stafford


1
오늘 Django 1.7에서 이것을 테스트했는데 좋은 생각이 아닙니다. 작동하는 동안 type필드는 데이터베이스에 기록 되지만 type나중에 속성에 액세스 하면 변경 사항이 반영되지 않습니다. 코드에서 말하면 이것은 실패 할 것 assert(employe.type.id == 4)입니다.
Rune Kaagaard

3
@AmichaiSchreiber 저는 Django의 다음 릴리스에서이 문제를 해결할 것이라고 믿습니다. code.djangoproject.com/ticket/27710
Will Hardy

2
앞으로 여기에 오는 모든 사람들을 위해이 문제는 Django 2.1 에서 수정되었습니다 .
humcat

45

create 를 사용하여 개체를 만들고 한 줄로 데이터베이스에 저장 하는 대안 :

employee = Employee.objects.create(first_name='first', last_name='last', type_id=4)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.