Lewati ke isi

Komentar yang ditangguhkan

model referensi diri

Ketika Anda ingin mereferensikan model yang sama selama deklarasi untuk membuat hubungan, Anda perlu menyatakan model yang direferensikan sebagai ForwardRef, karena kelas tidak siap selama deklarasi dan Python tidak akan membiarkan Anda merujuknya secara default.

Meskipun Anda mungkin ingin menggunakan anotasi di masa mendatang atau hanya merujuk nama dengan, "itu tidak akan berhasil karena ormar dimaksudkan untuk digunakan dengan ForwardRef yang dinyatakan secara eksplisit.

Pertama, Anda perlu mengimpor referensi yang diperlukan dari input.

1
ForwardRef impor dari mengetik

Sekarang kita membutuhkan model sampel dan referensi ke model yang sama, yang akan digunakan untuk membuat hubungan referensi diri.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Orang yang membuat penerusan menjadi model
Pribadi = TerdepanRef ("Orang")


Kelas Orang (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 100)
    # gunakan forwardref sebagai parameter untuk
    Supervisor: PersonRef = ormar. ForeignKey (PersonRef, terkait _ name = "karyawan")

Sesederhana itu. Namun sebelum menggunakan model, Anda perlu memperbarui referensi secara manual agar menghasilkan model yang sebenarnya.

Peringatan!!!Jika Anda mencoba menggunakan model tanpa memperbarui referensi, pengecualian ModelError akan dilemparkan. Oleh karena itu, pada contoh di atas, setiap panggilan seperti berikut akan menghasilkan pengecualian python # creation of model - exception await Person.objects.create(name="Test") # initialization of model - exception Person2(name="Test") # usage of model's QuerySet - exception await Person2.objects.get()

Untuk memperbarui referensi, hubungi metode pembaruan\ _ forward\ _ refs pada setiap model dengan referensi ke depan hanya setelah menyatakan semua model terkait.

Oleh karena itu, agar contoh kita sebelumnya berfungsi dengan baik, kita hanya membutuhkan garis tambahan.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Pribadi = TerdepanRef ("Orang")


Kelas Orang (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 100)
    Supervisor: PersonRef = ormar. ForeignKey (PersonRef, terkait _ name = "karyawan")


Pribadi. perbarui _ forward _ refs ()

Tentu saja, untuk ke dan melalui parameter, operasi yang sama dapat dilakukan pada hubungan ManyToMany dengan cara yang persis sama.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# nyatakan referensi
ChildRef = ForwardRef ("Anak")

Teman Anak Kelas (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

Anak Kelas (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 100)
    # gunakan dalam hubungan
    Teman = ormar. Banyak (ChildRef, melalui = Teman Masa Kecil,
                               terkait _ name = "juga _ friends")


Anak kecil. perbarui _ forward _ refs ()

hubungan lintas model

Mekanisme dan logika yang sama sebagai model referensi diri dapat digunakan untuk menghubungkan beberapa model yang berbeda satu sama lain.

Tentu saja, ormar akan membuat hubungan terbalik untuk kedua sisi hubungan tautan Anda menggunakan\ _ nama terkait (atau default) yang ditentukan.

Namun, jika Anda membutuhkan dua (atau lebih) hubungan antara dua model, untuk alasan apa pun, hubungan itu harus disimpan di kedua sisi (jadi nyatakan satu hubungan pada satu model dan lainnya pada model kedua), Anda perlu menggunakan ForwardRef untuk mencapainya.

Simak contoh sederhana berikut ini.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# guru belum didefinisikan
Guru = PenerusanRef ("Guru")


Siswa Kelas (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 100)
    # jadi kami menggunakan referensi alih-alih model yang sebenarnya
    primary _ teacher: TeacherRef = ormar. ForeignKey (TeacherRef,
                                                   terkait _ name = "sendiri _ student")


Kelas StudentTeacher (ormar. Model):
    ormar _ config = base _ ormar _ config (tablename = 'siswa _ x _ guru')


Kelas Guru (ormar. Model):
    ormar _ config = base _ ormar _ config copy ()

    Id: int = ormar. Integer (primary _ key = Benar)
    Nama: str = ormar. String (max _ length = 100)
    # kami membutuhkan siswa untuk hubungan lain maka perintah
    Siswa = ormar. Banyak (Siswa, through=StudentTeacher,
                                terkait _ name = "guru")

# sekarang model Guru sudah ditentukan, kami dapat memperbarui referensi
Student. perbarui _ forward _ refs ()

!!! Peringatan Ingatlah bahwa tidak peduli berapa banyak hubungan yang didefinisikan,\ _ nama terkait harus unik dalam model terkait.