Bergabung dan mengajukan
Untuk menggabungkan satu tabel ke tabel lain untuk juga memuat model terkait, Anda dapat menggunakan metode berikut.
-
select_related(related: Union[List, str]) -> QuerySet -
select_all(follow: bool = True) -> QuerySet -
prefetch_related(related: Union[List, str]) -> QuerySet -
model
- Metode model.load ()
-
Agen Setelan Kueri
-
QuerysetProxy.select_related(related: Union[List, str])metode QuerysetProxy.select_all(follow: bool=True)metodeQuerysetProxy.prefetch_related(related: Union[List, str])metode
Pilih yang relevan
select_related(related: Union[List, str]) -> QuerySet
Memungkinkan model terkait untuk dipilih selama kueri yang sama.
Saat menggunakan\ _ lated terpilih, selalu hanya satu kueri yang di jalankan terhadap database, yang berarti sambungan (terkadang kompleks) dihasilkan dan model bersarang selanjutnya diproses dalam Python.
Untuk mendapatkan model yang relevan, gunakan nama kunci asing.
Untuk menghubungkan hubungan model terkait, gunakan garis bawah ganda di antara nama.
Catatan!!!Jika Anda dari Django, harap dicatat bahwa ormarSelect\ _ lated di Django berbeda dari - >, Anda hanya dapat memilih satu jenis hubungan, sedangkan di ormar Anda dapat memilih terkait, kebalikan dari kunci asing di seberang hubungan kunci asing (jadi kunci virtual yang dibuat otomatis) Dan bidang ManyToMany (jadi semua hubungan dalam versi saat ini).
!!!Tip Untuk mengontrol bidang model mana yang dipilih, gunakan bidang () dan kecuali\ _ bidang () metode QuerySet.
!!!Tip Untuk mengontrol urutan model (master atau bersarang), gunakan metode urutan\ _ by ().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
Anda dapat memberikan string atau daftar string (atau daftar bidang / bidang).
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 | |
Bidang Many2Banyak berperilaku persis sama, di mana Anda dapat memasukkan nama bidang Many2Many dan mendapatkan model terakhir untuk Anda.
PERINGATAN!!!Jika Anda mengatur bidang ForeignKey ke bidang yang tidak dapat dibatalkan (dan karenanya diperlukan) selama semua pertanyaan, model yang tidak dapat dibatalkan secara otomatis dipilih, bahkan jika Anda tidak memasukkannya ke dalam\ _ lated terpilih.
Pilih Semua
select_all(follow: bool = False) -> QuerySet
Secara default, tidak ada hubungan yang dimuat saat Anda memilih semua (), dan sekali lagi, saat menggunakan\ _ lated () terpilih, Anda perlu secara eksplisit menentukan semua hubungan yang harus dimuat. Ini bisa menjadi rumit jika Anda juga ingin memasukkan hubungan bersarang.
Inilah sebabnya mengapa pilih\ _ semua () diperkenalkan, jadi semua hubungan model dimuat secara default (sebagai lawan dari semua () metode).
Secara default, hanya model yang terkait langsung dengan model induk (dari mana kueri di jalankan) yang ditambahkan.
Jika Anda menetapkan ikuti = Benar, itu juga menambahkan model terkait model terkait.
!!!Info agar tidak terjebak dalam lingkaran tak terbatas, karena model terkait juga menjaga hubungan dengan model induk yang mengakses set model.
1 2 3 4 | |
Tanggal sampel adalah sebagai berikut:
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 | |
Untuk memilih semua perusahaan dengan semua cabang dan alamat, Anda hanya perlu menanyakan:
1 2 3 4 | |
Tentu saja, dalam hal ini, sangat mudah untuk mengeluarkan nama hubungan eksplisit di\ _ lated terpilih, tetapi manfaat dari\ _ all () terpilih menjadi jelas ketika Anda memiliki banyak hubungan.
Misalnya, jika Perusahaan memiliki 3 hubungan, dan ketiga hubungan tersebut memiliki 3 hubungan mereka sendiri, Anda harus mengeluarkan 9 string hubungan untuk memilih\ _ lated, dan memilih\ _ semua () tidak dapat mengubah nama hubungan.
!!!Perhatikan bahwa Anda dapat menautkan pilih\ _ semua () dengan metode QuerySet lainnya seperti filter, tidak termasuk\ _ bidang, dll. Untuk mengecualikan suatu hubungan, gunakan panggilan kecuali\ _ field () dengan nama hubungan (juga bersarang) untuk mengecualikan.
korelasi prefetch
prefetch_related(related: Union[List, str]) -> QuerySet
Hal ini diperbolehkan untuk prefetch model terkait selama kueri - tetapi sebagai lawan dari\ _ lated terpilih, setiap model berikutnya diambil dalam kueri database terpisah.
Dengan prefetch\ _ lated, setiap model menjalankan satu pertanyaan terhadap database, yang berarti Anda akan mengeksekusi beberapa pertanyaan satu demi satu.
Untuk mendapatkan model yang relevan, gunakan nama kunci asing.
Untuk menghubungkan hubungan model terkait, gunakan garis bawah ganda di antara nama.
!!!Tip Untuk mengontrol bidang model mana yang dipilih, gunakan bidang () dan kecuali\ _ bidang () metode QuerySet.
!!!Tip Untuk mengontrol urutan model (master atau bersarang), gunakan metode urutan\ _ by ().
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 | |
Anda dapat memberikan string atau daftar string
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 | |
Bidang Many2Banyak berperilaku persis sama, di mana Anda dapat memasukkan nama bidang Many2Many dan mendapatkan model terakhir untuk Anda.
Peringatan!!!: Jika Anda mengatur bidang ForeignKey ke tidak dapat dibatalkan (dan karena itu diperlukan) selama semua pertanyaan, model yang tidak dapat dibatalkan secara otomatis dipilih, bahkan jika Anda tidak memasukkannya ke dalam\ _ lated terpilih.
Pilih korelasi vs. korelasi prefetch
Manakah dari - > pilih\ _ lated atau prefetch\ _ lated yang harus Anda gunakan?
Yah, itu benar-benar tergantung pada data Anda. Jawaban terbaik adalah mencobanya sendiri dan melihat mana yang berkinerja lebih cepat / lebih baik dalam keterbatasan sistem Anda.
Yang harus diingat:
kinerja
Jumlah pertanyaan: pilih\ _ lated selalu melakukan satu pertanyaan terhadap database, sementara prefetch\ _ lated melakukan beberapa pertanyaan. Operasi kueri (I / O) biasanya, tetapi tidak harus, yang paling lambat.
Jumlah baris: Misalkan ada 10.000 objek pada Tabel A, setiap objek memiliki 3 objek anak pada Tabel B, dan kemudian setiap objek pada Tabel B memiliki 2 objek anak pada Tabel C. Sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 | |
Ini berarti bahwa pilih\ _ lated akan selalu mengembalikan 60.000 baris (10.000*3*2), kemudian dikompresi menjadi 10.000 model.
Berapa baris yang akan mengembalikan prefetch\ _ lated?
Yah, itu tergantung, jika masing-masing model B dan C unik, maka akan mengembalikan 10.000 baris di kueri pertama dan 30.000 baris di kueri kedua (3 subitem A di Tabel B) Masing-masing unik), dan 60.000 baris (setiap anak di Tabel B unik). 2 anak Model B di Tabel C unik di kueri ketiga).
Dalam hal ini, pilih\ _ lated sepertinya pilihan yang lebih baik, tidak hanya akan menjalankan kueri dibandingkan dengan 3 prefetches\ _ lated, tetapi akan kembali 60 dibandingkan dengan 100.000 prefetches\ _ lated (10 + 30 + 60k) 000 baris.
Tetapi bagaimana jika setiap model A memiliki tiga model B yang sama persis, dan setiap model C memiliki model C yang sama persis? Select\ _ lated masih akan mengembalikan 60.000 baris, sedangkan prefetch\ _ lated akan mengembalikan 10.000 baris untuk model A, 3 baris untuk model B, dan 2 baris untuk model C. Jadi total 10.006 baris. Sekarang, tergantung pada struktur model (yaitu, jika memiliki bidang Teks () yang panjang, dll.), prefetch\ _ lated mungkin lebih cepat, meskipun perlu mengeksekusi tiga pertanyaan terpisah, bukan satu.
Memori
Ormar tidak mempertahankan regedit untuk model yang dimuat.
Ini berarti bahwa dalam contoh\ _ yang dipilih di atas, Anda akan selalu memiliki 10.000 model A, 30.000 model B (bahkan jika jumlah baris unik dalam database adalah 3 - pilih\ _ pemrosesan terlambat menghasilkan yang baru untuk setiap model induk Submodel). Dan 60.000 model C.
Jika baris 1, 10, 100, dll. berbagi model B yang sama, dan Anda memperbarui salah satunya, baris tersisa yang berbagi anak yang sama tidak akan segera diperbarui. Jika Anda menyimpan perubahan Anda ke database, perubahan hanya tersedia setelah memuat ulang (memuat setiap item anak satu per satu atau memuat ulang seluruh pertanyaan). Ini berarti bahwa pilih\ _ lated akan menggunakan lebih banyak memori karena setiap objek anak dibuat sebagai objek baru
- Jelas, dia menggunakan ruangnya sendiri.
!!!Ketahuilah bahwa ini dapat berubah dalam rilis mendatang jika kami memutuskan untuk memperkenalkan caching.
Peringatan: Secara default, semua anak (atau peristiwa di mana model yang sama dimuat lebih dari dua kali) benar-benar terpisah dan objek Python yang berbeda, meskipun mereka mewakili baris yang sama dalam database.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
Sebaliknya, dengan prefetch\ _ lated, setiap model anak yang berbeda secara unik hanya dibuat sekali, dan model anak yang sama dibagikan di antara semua model orang tua. Ini berarti bahwa dalam contoh\ _ lated prefetch di atas, jika ada 3 model berbeda pada Tabel B dan 2 model berbeda pada Tabel C, hanya 5 model subnested yang akan dibagikan di antara semua contoh Model A. Ini juga berarti bahwa jika Anda memperbarui properti apa pun, semua objek orang tua akan memperbarui properti itu karena mereka berbagi objek anak yang sama.
metode model
Setiap contoh model memiliki seperangkat metode untuk menyimpan, memperbarui, atau memuat dirinya sendiri.
beban
Anda dapat memuat model terkait ForeignKey dengan memanggil metode beban ().
Load () dapat digunakan untuk me-refresh model dari database jika telah diubah oleh proses lain.
!!!Tip Baca lebih lanjut tentang metode beban () dalam metode model
Metode QuerysetProxy
Saat mengakses bidang ManyToMany dan ReverseForeignKey yang relevan secara langsung, daftar model terkait dikembalikan.
Tetapi juga memaparkan subset dari QuerySet API, sehingga Anda dapat memfilter, membuat, memilih model terkait, dll. langsung dari model induk.
Pilih yang relevan
Persis sama dengan fungsi\ _ lated yang dipilih di atas, tetapi memungkinkan Anda untuk mendapatkan objek terkait dari ujung hubungan yang lain.
!!!Untuk mempelajari lebih lanjut tentang QuerysetProxy, kunjungi bagian QuerysetProxy
Pilih Semua
Sama persis dengan\ _ semua fungsi yang dipilih di atas, tetapi memungkinkan Anda untuk mendapatkan objek terkait dari ujung hubungan yang lain.
!!!Untuk mempelajari lebih lanjut tentang QuerysetProxy, kunjungi bagian QuerysetProxy
korelasi prefetch
Persis sama dengan fungsi prefetch\ _ lated di atas, tetapi memungkinkan Anda untuk mengambil objek terkait dari ujung hubungan yang lain.
!!!Untuk mempelajari lebih lanjut tentang QuerysetProxy, kunjungi bagian QuerysetProxy