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