sinyal
Sinyal adalah mekanisme yang memicu kode Anda (fungsi / metode) setiap kali jenis peristiwa tertentu terjadi di ormar.
Oleh karena itu, Anda perlu mendaftarkan penerima untuk jenis sinyal yang diberikan dari model yang dipilih.
Tentukan penerima
Contoh model berikut diberikan:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Misalnya, Anda dapat menentukan pemicu yang menetapkan album.is\ _ best\ _ seller state jika album dimainkan lebih dari 50 kali.
Impor dekorator pra\ _ pembaruan dan lihat daftar dekorator / sinyal yang tersedia saat ini di bawah 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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | |
Tentukan fungsi Anda.
Harap dicatat bahwa setiap penerima memiliki fitur:
- Harus dapat dipanggil
- Harus menerima argumen pengirim pertama dari kelas objek terima-kirim
- harus menerima argumen kwargs**sebagai argumen yang di kirim di setiap ormar. Sinyal dapat berubah kapan saja, jadi fungsi Anda harus melayani mereka.
- Itu pasti asinkron karena panggilan balik dikumpulkan dan menunggu.
Pra\ _ pembaruan saat ini hanya mengirimkan satu parameter selain pengirim, dan ini adalah contoh satu.
Perhatikan bagaimana dekorator pra\ _ pembaruan menerima parameter pengirim, yang dapat berupa model tunggal atau daftar model yang ingin Anda jalankan penerima sinyal.
Saat ini, tidak mungkin untuk mengatur sinyal untuk semua model segera tanpa secara eksplisit meneruskan semua model ke registri penerima.
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | |
!!!Perhatikan bahwa penerima didefinisikan pada tingkat kelas - >, jadi meskipun Anda menghubungkan / memutuskan fungsi melalui instance, itu akan menjalankan / menghentikan semua operasi di ormar itu. Kelas model.
Harap dicatat bahwa fungsi kami yang baru dibuat memiliki contoh dan kelas contoh, sehingga Anda dapat dengan mudah menjalankan kueri database di dalam wastafel jika Anda mau.
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | |
Anda dapat menentukan penerima yang sama untuk beberapa model sekaligus dengan memberikan daftar model ke dekorator sinyal.
1 2 3 4 | |
Tentu saja, Anda juga dapat membuat beberapa fungsi untuk sinyal dan model yang sama. Masing-masing akan berjalan pada setiap sinyal.
1 2 3 4 5 6 7 | |
Harap dicatat bahwa dekorator ormar adalah gula sintaksis, dan Anda dapat langsung menghubungkan fungsi atau metode sinyal yang diberikan untuk model tertentu. Connect hanya membutuhkan satu argumen - fungsi / metode penerima Anda.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
!!! Peringatan Harap dicatat bahwa sinyal menyimpan referensi ke penerima (bukan referensi yang lemah), jadi ingatlah ini untuk menghindari referensi melingkar.
Putuskan sambungan penerima
Untuk melepaskan penerima dan menghentikannya menjalankan model tertentu, Anda harus melepaskannya.
1 2 3 4 5 6 7 8 9 10 | |
sinyal yang tersedia
!!!Peringatan, harap dicatat bahwa tidak ada sinyal yang akan di kirim.
1 2 3 4 | |
pra-simpan
pre_save(sender: Type["Model"], instance: "Model")
Kirim Model.save () dan metode Model.objeks.create ().
Pengirim adalah ormar. Kelas model, contoh model yang akan disimpan.
Setelah menabung
post_save(sender: Type["Model"], instance: "Model")
Kirim Model.save () dan metode Model.objeks.create ().
Pengirim adalah ormar. Kelas model, contoh model yang disimpan.
pra-pembaruan
pre_update(sender: Type["Model"], instance: "Model")
Di kirim ke metode Model.update ().
Pengirim adalah ormar. Kelas model, contoh model yang akan diperbarui.
Setelah pembaruan
post_update(sender: Type["Model"], instance: "Model")
Di kirim ke metode Model.update ().
Pengirim adalah ormar. Kelas model, contoh model yang diperbarui.
pra-hapus
pre_delete(sender: Type["Model"], instance: "Model")
Kirim Model.save () dan metode Model.objeks.create ().
Pengirim adalah ormar. Kelas model, contoh model yang akan dihapus.
setelah penghapusan
post_delete(sender: Type["Model"], instance: "Model")
Di kirim ke metode Model.update ().
Pengirim adalah ormar. Kelas model, contoh model yang dihapus.
penambahan pra-hubungan
pre_relation_add(sender: Type["Model"], instance: "Model", child: "Model", relation_name: str, passed_args: Dict)
Mengirimkan metode Model.relation\ _ name () dari hubungan banyak-ke-banyak dan kebalikan dari hubungan kunci asing.
Pengirim - kelas pengirim, misalnya - tambahkan contoh model terkait, model anak ditambahkan, hubungan\ _ nama - nama relasi untuk menambah anak, juga dilewatkan untuk menambahkan sinyal\ _ kwargs - kamus kwarg dilewatkan untuk menambahkan ()
pasca hubungan tambahkan
post_relation_add(sender: Type["Model"], instance: "Model", child: "Model", relation_name: str, passed_args: Dict)
Mengirimkan metode Model.relation\ _ name () dari hubungan banyak-ke-banyak dan kebalikan dari hubungan kunci asing.
Pengirim - kelas pengirim, misalnya - tambahkan contoh model terkait, model anak ditambahkan, hubungan\ _ nama - nama relasi untuk menambah anak, juga dilewatkan untuk menambahkan sinyal\ _ kwargs - kamus kwarg dilewatkan untuk menambahkan ()
penghapusan pra-hubungan
pre_relation_remove(sender: Type["Model"], instance: "Model", child: "Model", relation_name: str)
Mengirimkan metode Model.relation\ _ name () dari hubungan banyak-ke-banyak dan kebalikan dari hubungan kunci asing.
Pengirim - Kelas pengirim, misalnya - Tambahkan contoh model terkait, anak - Model ditambahkan, hubungan\ _ nama - Nama relasi untuk menambah anak.
Setelah menghapus hubungan
post_relation_remove(sender: Type["Model"], instance: "Model", child: "Model", relation_name: str, passed_args: Dict)
Mengirimkan metode Model.relation\ _ name () dari hubungan banyak-ke-banyak dan kebalikan dari hubungan kunci asing.
Pengirim - Kelas pengirim, misalnya - Tambahkan contoh model terkait, anak - Model ditambahkan, hubungan\ _ nama - Nama relasi untuk menambah anak.
Setelah pembaruan batch
post_bulk_update(sender: Type["Model"], instances: List["Model"], **kwargs), di kirim ke metode Model.objects.bulk_update(List[objects]).
Tentukan sinyal Anda sendiri
Harap dicatat bahwa Anda dapat membuat sinyal Anda sendiri, meskipun Anda harus mengirimkannya secara manual dalam kode atau subclass ormar. Model dan picu sinyal di sana.
Membuat sinyal baru itu sederhana. Contoh berikut mengatur sinyal baru bernama sinyal\ _ custom\ _ Anda.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
Faktanya, lapisan bawah sinyal adalah instance SignalEmitter yang menyimpan kamus sinyal yang diketahui dan memungkinkan Anda mengaksesnya sebagai properti. Saat Anda mencoba mengakses sinyal yang tidak ada, SignalEmitter akan membuat sinyal untuk Anda.
Jadi contoh di atas dapat disederhanakan menjadi. Sinyal akan dibuat untuk Anda.
1 | |
Sekarang untuk memicu sinyal ini, Anda perlu menghubungi metode pengiriman sinyal.
1 | |
Harap dicatat bahwa pengirim adalah satu-satunya parameter yang diperlukan, dan itu harus menjadi kelas Model Ormar.
Parameter tambahan harus dilewatkan sebagai argumen kata kunci.
1 | |