ในโครงการ Django ที่ฉันรู้ว่าpk
จะให้ผลตอบแทนที่id
ฉันต้องการเสมอid
เมื่อไม่ขัดแย้งกับid()
ฟังก์ชัน (ทุกที่ยกเว้นชื่อตัวแปร) เหตุผลของเรื่องนี้ก็คือว่าpk
เป็นทรัพย์สินซึ่งเป็นครั้งที่ 7 ช้ากว่าid
เพราะมันต้องใช้เวลาในการมองขึ้นชื่อแอตทริบิวต์ในpk
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)
นี่คือรหัส Django ที่เกี่ยวข้อง:
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
ทุกที่ หนึ่งในสามของไมโครวินาทีนั้นไม่ได้มีไว้สำหรับเว็บ
id
และสำหรับpk