Django คีย์ต่างประเทศแบบอ้างอิงตัวเอง


166

ฉันเป็นคนใหม่สำหรับ webapps และฐานข้อมูลโดยทั่วไปดังนั้นนี่อาจเป็นคำถามที่โง่ ฉันต้องการสร้างแบบจำลอง ("CategoryModel") ด้วยฟิลด์ที่ชี้ไปที่ id หลักของอินสแตนซ์อื่นของแบบจำลอง (แม่ของมัน)

class CategoryModel(models.Model):
    parent = models.ForeignKey(CategoryModel)

ฉันจะทำสิ่งนี้ได้อย่างไร ขอบคุณ!


2
stylistically ผมจะขอแนะนำให้โทรนี้parentแทนparentIdเนื่องจากจะเป็นตัวอย่างของmy_category_model.parent CategoryModelDjango จะสร้างสมาชิกโดยอัตโนมัติparent_idซึ่งจะเป็นคีย์หลักของโมเดลที่เกี่ยวข้อง
10flow

คำตอบ:


263

คุณสามารถส่งผ่านชื่อรุ่นเป็นสตริงไปที่ ForeignKey และมันจะทำสิ่งที่ถูกต้อง

ดังนั้น:

parent = models.ForeignKey("CategoryModel")

หรือคุณสามารถใช้สตริง "ตัวเอง"

parent = models.ForeignKey("self")

55

คุณสามารถใช้สตริง 'ตนเอง' เพื่อระบุการอ้างอิงตนเอง

class CategoryModel(models.Model):
    parent = models.ForeignKey('self')

https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey


7
ฉันคิดว่าคุณหมายถึง 'ตัวเอง' เช่นเดียวกับในสตริง ตนเองไม่ได้กำหนดไว้ในบริบทนี้
Jared Forsyth

1
@Brandon 'ตัวเอง' ในคำตอบของคุณแตกต่างจากสิ่งที่ jared พูดในความคิดเห็นของเขาอย่างไร? "ฉันคิดว่าคุณหมายถึง 'ตัวเอง" !!! . ทั้งสองเป็นสตริงที่ดีตามเอกสาร django ! คำแนะนำใด ๆ
Stryker

1
ความแตกต่างคือselfไม่มีเมื่อกำหนดคุณสมบัติของโมเดล หากคุณสมบัติถูกกำหนดเป็นส่วนหนึ่งของ__init__()หรือวิธีอื่นมันจะเป็นเช่นเดียวselfกับอาร์กิวเมนต์ตำแหน่งแรกเสมอกับวิธีการอินสแตนซ์ใด ๆ ของคลาส Python
Brandon


1

คุณยังสามารถชำระ null = True และ blank = True

class CategoryModel(models.Model):
    parent = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True)

null = True เพื่ออนุญาตในฐานข้อมูล
blank = True เพื่ออนุญาตในการตรวจสอบความถูกต้องของฟอร์ม

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