ข้อความค้นหา Django - id vs pk


203

เมื่อเขียนแบบสอบถาม django หนึ่งสามารถใช้ทั้ง id / pk เป็นพารามิเตอร์แบบสอบถาม

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

ฉันรู้ว่า pk ย่อมาจาก Primary Key และเป็นเพียงทางลัดตามเอกสารของ django อย่างไรก็ตามมันไม่ชัดเจนเมื่อควรใช้ id หรือ pk


นี่คือเอกสารที่เกี่ยวข้อง: สำหรับidและสำหรับpk
Lutz Prechelt

มีความเป็นไปได้ที่ซ้ำกันของModel.id และ Model.pk ใน django คืออะไร
เทรวิส

ต้องการทราบว่ามีอะไรเพิ่มเติมหรือไม่docs.djangoproject.com/en/1.11/topics/db/queries/…
Rajan Chauhan

ตรวจสอบเวอร์ชั่นล่าสุดได้ที่นี่docs.djangoproject.com/en/2.2/topics/db/models/ …
Tessaracter

คำตอบ:


224

มันไม่สำคัญ pkมีความเป็นอิสระมากขึ้นจากสนามคีย์หลักที่เกิดขึ้นจริงเช่นคุณไม่จำเป็นต้องดูแลไม่ว่าจะเป็นข้อมูลคีย์หลักจะเรียกว่าidหรือobject_idหรืออะไรก็ตาม

นอกจากนี้ยังมีความสอดคล้องมากขึ้นถ้าคุณมีรุ่นที่มีเขตข้อมูลคีย์หลักที่แตกต่างกัน


34
อ๋อ เพียงใช้ pk เสมอ.
cethegeek

47
idเป็นฟังก์ชั่นในตัวใน Python ฉันชอบใช้ pk เพราะสิ่งนั้น
ธีรี่ร์แลม

5
ใช่pkเป็นที่ชื่นชอบ ดูเอกสารประกอบของฟังก์ชั่นidในตัวใน Python standard library (มันเหมือนกันใน Python 2 )
Lutz Prechelt

26

ในโครงการ 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ทุกที่ หนึ่งในสามของไมโครวินาทีนั้นไม่ได้มีไว้สำหรับเว็บ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.