Trong các dự án Django nơi tôi biết rằng pk
luôn trả về id
tôi thích sử dụng id
khi nó không xung đột với id()
hàm (ở mọi nơi trừ tên biến). Lý do cho điều này là pk
một thuộc tính chậm hơn 7 lần so với id
việc mất thời gian tìm kiếm pk
tên thuộc tính meta
.
%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)
Đây là mã Django có liên quan:
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)
Đây thực sự là một trường hợp hiếm hoi khi tôi cần sử dụng một biến có tên pk
. Tôi thích sử dụng một cái gì đó dài dòng hơn, như user_id
thay vì pk
.
Theo cùng một quy ước là tốt hơn trên toàn bộ dự án. Trong trường hợp của bạn id
là một tên tham số, không phải là một thuộc tính, vì vậy hầu như không có sự khác biệt về thời gian. Tên tham số không xung đột với tên của id()
hàm tích hợp, vì vậy nó an toàn khi sử dụng id
ở đây.
Để tổng hợp, tùy thuộc vào bạn chọn sử dụng tên trường id
hoặc pk
phím tắt. Nếu bạn không phát triển thư viện cho Django và sử dụng các trường khóa chính tự động cho tất cả các mô hình, thì có thể sử dụng id
ở mọi nơi, điều này đôi khi nhanh hơn. Mặt khác, nếu bạn muốn truy cập toàn cầu vào các trường khóa chính (có thể tùy chỉnh), thì hãy sử dụng pk
ở mọi nơi. Một phần ba của một phần triệu giây là không có gì cho web.
id
và chopk