장고 쿼리-ID vs pk


203

django 쿼리를 작성할 때 id / pk를 쿼리 매개 변수로 사용할 수 있습니다.

Object.objects.get(id=1)
Object.objects.get(pk=1)

django의 문서에 따르면 pk는 기본 키를 나타내며 지름길이라는 것을 알고 있습니다. 그러나 언제 id 또는 pk를 사용해야하는지 명확하지 않습니다.


여기 각각의 문서가 있습니다 : forid and forpk
Lutz Prechelt


뭔가 더 큰지
Rajan Chauhan

답변:


224

중요하지 않습니다. pk당신이 기본 키 필드가 호출되는지 여부를 신경 쓸 필요가없는, 즉 실제 기본 키 필드에서 더 많은 독립적 인 id또는 object_id또는 무엇 이건.

또한 기본 키 필드가 다른 모델이있는 경우 일관성이 향상됩니다.


34
네. 그냥 pk를 사용하십시오. 항상.
cethegeek

47
id또한 파이썬에서 내장 함수이며, 그 때문에 pk를 사용하는 것을 선호합니다.
Thierry Lam

5
예, pk바람직합니다. Python 표준 라이브러리 의 내장 함수 설명서를id 참조하십시오 . ( Python 2 에서도 마찬가지입니다 .)
Lutz Prechelt

26

내가 pk항상 반환 한다는 것을 알고있는 Django 프로젝트에서는 함수 (변수 이름을 제외한 모든 곳) 와 충돌하지 않을 때 id사용하는 것을 선호합니다 . 그 이유 는에서 속성 이름을 찾는 데 시간이 걸리기 때문에 7 배 더 느린 속성 이기 때문 입니다 .idid()pkidpkmeta

%timeit obj.id
46 ns ± 0.187 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
%timeit obj.pk
347 ns ± 11.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

관련 장고 코드는 다음과 같습니다.

def _get_pk_val(self, meta=None):
    meta = meta or self._meta
    return getattr(self, meta.pk.attname)

def _set_pk_val(self, value):
    return setattr(self, self._meta.pk.attname, value)

pk = property(_get_pk_val, _set_pk_val)

라는 변수를 사용해야하는 경우는 거의 없습니다 pk. 나는 user_id대신에 더 자세한 것을 사용하는 것을 선호합니다 pk.

전체 프로젝트에서 동일한 규칙을 따르는 것이 좋습니다. 귀하의 경우 id속성이 아닌 매개 변수 이름이므로 타이밍 차이가 거의 없습니다. 매개 변수 이름은 내장 id()함수 의 이름과 충돌하지 않으므로 id여기서 사용하는 것이 안전합니다 .

요약하면 필드 이름을 사용할지 id또는 pk바로 가기 를 사용할지를 선택하는 것은 사용자의 몫 입니다. Django 용 라이브러리를 개발하지 않고 모든 모델에 자동 기본 키 필드 를 사용 id하는 경우, 어느 곳에서나 사용하는 것이 안전하며 때로는 더 빠릅니다. 반면, 기본 키 필드 (아마도 사용자 정의)에 대한 범용 액세스를 원한다면 pk어디에서나 사용하십시오 . 마이크로 초의 3 분의 1은 웹을위한 것이 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.