Kunci asing referensi-sendiri Django


165

Saya agak baru di webapps dan database secara umum jadi ini mungkin pertanyaan bodoh. Saya ingin membuat model ("CategoryModel") dengan bidang yang menunjuk ke id utama contoh lain dari model (induknya).

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

Bagaimana saya melakukan ini? Terima kasih!


2
Secara gaya, saya akan menyarankan memanggil ini parentbukan parentId, karena my_category_model.parentakan menjadi contoh dari CategoryModel. Django akan secara otomatis membuat anggota parent_idyang akan menjadi kunci utama dari model terkait.
10flow

Jawaban:


262

Anda dapat memberikan nama model sebagai string ke ForeignKey dan itu akan melakukan hal yang benar.

Begitu:

parent = models.ForeignKey("CategoryModel")

Atau Anda bisa menggunakan string "diri"

parent = models.ForeignKey("self")

55

Anda dapat menggunakan string 'diri' untuk menunjukkan referensi-diri.

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

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


7
Saya pikir maksud Anda adalah 'diri'. Seperti dalam string. diri tidak terdefinisi dalam konteks ini
Jared Forsyth

1
@Brandon Apa perbedaan 'diri' dalam jawaban Anda dengan apa yang dikatakan jared dalam komentarnya? "Aku pikir maksudmu 'diri" !!! . Keduanya adalah string yang baik-baik saja menurut django docs. ! Petunjuk apa pun
Stryker

1
Perbedaannya adalah bahwa selftidak ada saat mendefinisikan properti model. Jika properti sedang didefinisikan sebagai bagian dari __init__()atau metode lain, itu akan menjadi, seperti selfselalu argumen posisi pertama untuk setiap metode instance dari kelas Python.
Brandon


1

Anda juga untuk menyelesaikan null = Benar dan kosong = Benar

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

null = Benar, untuk mengizinkan dalam database
kosong = Benar, untuk mengizinkan validasi formulir

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.