Filter dan urutkan data
Anda dapat menggunakan metode berikut untuk memfilter data (klausa SQL WHERE).
-
filter(*args, **kwargs) -> QuerySet -
exclude(*args, **kwargs) -> QuerySet -
Mendapatkan (*Args,*\ * kwargs) - > model
-
get_or_none(*args, **kwargs) -> Optional[Model] -
get_or_create(_defaults: Optional[Dict[str, Any]] = None, *args, **kwargs) -> Tuple[Model, bool] -
all(*args, **kwargs) -> List[Optional[Model]] -
Agen Setelan Kueri
QuerysetProxy.filter(*args, **kwargs)metodeQuerysetProxy.exclude(*args, **kwargs)metodeQuerysetProxy.get(*args, **kwargs)metodeQuerysetProxy.get_or_none(*args, **kwargs)metodeQuerysetProxy.get_or_create(_defaults: Optional[Dict[str, Any]] = None, *args, **kwargs)metodeQuerysetProxy.all(*args, **kwargs)metode
Dan urutkan data menggunakan metode berikut (urutan SQL berdasarkan klausa).
order_by(columns:Union[List, str, OrderAction]) -> QuerySet- Agen Setelan Kueri
QuerysetProxy.order_by(columns:Union[List, str, OrderAction])metode
penyaring
penyaring
filter(*args, **kwargs) -> QuerySet
Memungkinkan Anda memfilter berdasarkan atribut / bidang model apa pun dan mendapatkan instance menggunakan filter di seluruh hubungan FK.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
Filter ala Django
Anda dapat menggunakan akhiran filter khusus untuk mengubah operasi filter:
- tepat - cocok dengan nilai, kolom sql =
\ * dapat ditulis sebagai album\ __nama_\ _ tepat = 'Malibus' - iexactly - cocok persis kolom sql =
(kasus tidak sensitif) - dapat ditulis sebagai album\ __name_\ _ iexactly = 'malibu'
- berisi - kolom sql SEPERTI '%
%'\ * dapat ditulis sebagai album\ __nama_\ _ mengandung = 'Mal' - icontains - sql kolom SEPERTI '%
%' (case insensitive) \ * dapat ditulis sebagai album\ __name_\ _ icontains = 'mal' - dalam -sql
column IN (<VALUE1>, <VALUE2>, ...)\ * dapat ditulis sebagaialbum__name__in=['Malibu', 'Barclay'] - Isnull - sql kolom IS NULL (dan sql kolom IS NOT NULL)
- dapat ditulis sebagai album\ __name__isnull = Benar (album isnotnull__name_\ _ isnull = Salah)
- gt - kolom sql >
(lebih besar dari) \ * dapat ditulis sebagai posisi\ _\ _ gt = 3 - gte - kolom sql > =
(lebih besar dari atau sama dengan) \ * dapat ditulis sebagai posisi\ _\ _ gte = 3 - lt - kolom sql <
(di bawah) \ * dapat ditulis sebagai posisi\ _\ _ lt = 3 - lte - kolom sql < =
(kurang dari atau sama dengan) \ * dapat ditulis sebagai posisi\ _\ _ lte = 3 - startswith - kolom sql SEPERTI '
%' (pertandingan awal yang tepat) \ * dapat ditulis sebagai album\ __nama_\ _ startswith = 'Mal' - istartswith - kolom sql SEPERTI '
%' (case insensitive) \ * dapat ditulis sebagai album__name__istartswith='mal' - Endswith - kolom sql SEPERTI '%
' (pertandingan akhir yang tepat) \ * dapat ditulis sebagai album\ __Nama_\ _ endswith = 'ibu' - iendswith - kolom sql SEPERTI '%
' (case insensitive) \ * dapat ditulis sebagai album\ __name_\ _ iendswith = 'IBU'
Beberapa sampel:
1 2 3 4 5 6 7 8 9 10 11 | |
Filter gaya ular piton
- Tepat - cocok persis dengan nilai, kolom sql =
- Dapat ditulis sebagai Track.album.name = = 'Malibu
- itepat - cocok persis kolom sql =
(kasus tidak sensitif) - Dapat ditulis sebagai
Track.album.name.iexact('malibu')
- Dapat ditulis sebagai
- berisi - sql kolom LIKE '%
%'*dapat ditulis sebagai Track.album.name% 'Mal') *dapat ditulis sebagai Track.album.name.contains('Mal')Ikon* - kolom sql SEPERTI '%%' (case insensitive) \ * dapat ditulis sebagai Track.album.name.icontains('mal') - in -sql
column IN (<VALUE1>, <VALUE2>, ...)*dapat ditulis sebagaiTrack.album.name << ['Malibu', 'Barclay']*dapat ditulis sebagaiTrack.album.name.in_(['Malibu', 'Barclay']) - isnull - sql kolom IS NULL (dan sql kolom IS NOT NULL) *dapat ditulis sebagai Track.album.name > > None*dapat ditulis sebagai Track.album.name isnull (True) *dapat ditulis sebagai
Tidak null sebagai
Track.album.name.isnull(False)*tidak null dapat ditulis sebagai ~ (Track.album.name > > Tidak ada) \ * tidak null dapat ditulis sebagai~(Track.album.name.isnull(True)) - gt - sql kolom >
(lebih besar dari) \ * dapat ditulis sebagai Track.album.name > 3 - gte - sql kolom > =
(lebih besar dari atau sama dengan) \ * dapat ditulis sebagai Track.album.name > = 3 - lt - kolom sql <
(di bawah) \ * dapat ditulis sebagai Track.album.name < 3 - lte - sql kolom < =
(kurang dari atau sama dengan) \ * dapat ditulis sebagai Track.album.name < = 3 - startswith - kolom sql SEPERTI '
%' (pertandingan awal yang tepat) \ * dapat ditulis sebagai Track.album.name.startswith('Mal') - istartswith - kolom sql SEPERTI '
%' (case insensitive) \ * dapat ditulis sebagai Track.album.name.istartswith('mal') - endswith - kolom sql SEPERTI '%
' (pertandingan akhir yang tepat) \ * dapat ditulis sebagai Track.album.name.endswith('ibu') - iendswith - kolom sql SEPERTI '%
' (kasus tidak sensitif) \ * dapat ditulis sebagai Track.album.name.iendswith('IBU')
Beberapa sampel:
1 2 3 4 5 6 7 8 9 10 11 | |
Peringatan!!!, perhatikan bahwa Anda tidak perlu menentukan% wild-card yang berisi dan filter lainnya, itu ditambahkan untuk Anda. Jika Anda memasukkan% dalam nilai pencarian, itu akan lolos dan diperlakukan sebagai tanda persen literal dalam teks.
mengecualikan
exclude(*args, **kwargs) -> QuerySet
Ini bekerja persis sama dengan filter, dan semua pengubah (akhiran) sama, tetapi kondisi tidak dikembalikan.
Jadi jika Anda menggunakan filter (nama = 'John'), yang sama dengan di mana nama = 'John' dalam SQL, maka kecuali (nama = 'John') sama dengan di mana nama < > 'John'.
Harap dicatat bahwa semua kondisi digabungkan, jadi jika Anda melewati banyak nilai, itu menjadi penyatuan kondisi.
Pengecualian (nama = 'John', usia > = 35) menjadi where not (name='John' and age>=35)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Filter kompleks (termasuk OR)
Secara default, metode filter () dan kecuali () menggabungkan opsi filter yang disediakan dengan kondisi AND sehingga filter(name="John", age__gt=30) diterjemahkan menjadi WHERE name = 'John' AND age > 30.
Kadang-kadang berguna untuk menanyakan database menggunakan kondisi yang tidak boleh diterapkan bersama-sama, seperti WHERE name = 'John' OR age > 30, atau untuk membangun kompleks di mana pertanyaan di mana Anda ingin lebih banyak kontrol. Bagaimanapun,WHERE (name = 'John' OR age > 30) and city='New York' benar-benar berbeda dari WHERE name = 'John' OR (age > 30 and city='New York').
Untuk membangun OR dan kondisi bersarang, Ormar menyediakan dua fungsi yang dapat digunakan dalam filter () dan kecuali () dalam QuerySet dan QuerysetProxy.
!!!Perhatikan bahwa Anda dapat menyediakan metode ini dengan metode lain yang menerima\ * args, seperti get () atau all ().
Panggilan ke atau_dan_dapat bersarang satu sama lain atau dikombinasikan dengan argumen kata kunci. Karena kedengarannya lebih rumit dari yang sebenarnya, mari kita lihat beberapa contoh.
Diberi contoh model seperti ini:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Mari kita buat beberapa contoh data:
1 2 3 4 5 6 7 | |
Kita dapat membuat beberapa contoh pertanyaan kompleks:
Mari kita pilih buku atau buku Tolkien yang ditulis setelah tahun 1970
SQL: WHERE ( authors.name = 'J.R.R. Tolkien' OR books.year > 1970 )
Gaya Django
1 2 3 4 5 6 | |
Gaya ular piton
1 2 3 4 5 6 | |
Sekarang mari kita pilih buku yang ditulis oleh Tolkien setelah tahun 1960 atau sebelum tahun 1940.
SQL: WHERE ( books.year > 1960 OR books.year < 1940 ) AND authors.name = 'J.R.R. Tolkien'
Gaya Django
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
Gaya ular piton
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
Buku Sapkowski sebelum tahun 2000 atau buku Tolkien setelah tahun 1960
SQL: WHERE ( ( books.year > 1960 AND authors.name = 'J.R.R. Tolkien' ) OR ( books.year < 2000 AND authors.name = 'Andrzej Sapkowski' ) )
Gaya Django
1 2 3 4 5 6 7 8 9 10 11 | |
Gaya ular piton
1 2 3 4 5 6 7 8 9 | |
Tentu saja, fungsi ini dapat memiliki lebih dari dua syarat, jadi jika kita menginginkan buku yang mencakup "hobbit":
SQL: WHERE ( ( books.year > 1960 AND authors.name = 'J.R.R. Tolkien' ) OR ( books.year < 2000 AND os0cec_authors.name = 'Andrzej Sapkowski' ) OR books.title LIKE '%hobbit%' )
Gaya Django
1 2 3 4 5 6 7 8 9 10 11 | |
Gaya ular piton
1 2 3 4 5 6 7 8 9 | |
Jika mau atau perlu, Anda dapat bersarang kondisi yang lebih dalam sesuai kebutuhan, seperti menerapkan pertanyaan berikut:
SQL:
1 2 3 | |
Anda dapat menyusun pertanyaan sebagai berikut:
Gaya Django
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Gaya ular piton
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
Anda sekarang harus memahami cara kerja ormar.or_dan ormar.and_. Tentu saja, Anda dapat menghubungkannya ke salah satu metode lain dalam kumpulan kueri, jadi dalam contoh, kueri yang sepenuhnya valid mungkin terlihat seperti ini:
1 2 3 4 5 6 7 8 9 10 11 | |
Ini juga berlaku untuk menghubungkan dan bersarang ala Python.
Gaya Django
Harap dicatat bahwa dengan gaya Django, Anda tidak dapat memberikan argumen kata kunci yang sama beberapa kali, jadi mempertanyakan filter(ormar.or_(name='Jack', name='John')) sebagai berikut tidak diperbolehkan. Jika Anda ingin memeriksa beberapa nilai untuk kolom yang sama, cukup gunakan operator in:filter(name__in=['Jack','John']).
Jika hanya satu argumen yang diteruskan ke fungsi atau_atau_, itu hanya dilampirkan dalam tanda kurung dan tidak berpengaruh pada kueri yang sebenarnya, jadi ketiga kueri akhirnya menjadi sama:
1 2 3 | |
!!!Catatan atau_ Dan dan_ Pertanyaan akan memiliki MANA (judul = 'The Hobbit'), tetapi tanda kurung berlebihan dan tidak memiliki efek praktis.
Jika Anda benar-benar perlu menggunakan nama bidang yang sama dua kali, Anda dapat menggunakan fitur ini. Ingat bahwa Anda tidak dapat meneruskan argumen kata kunci yang sama ke fungsi dua kali, jadi bagaimana Anda menghitung WHERE (authors.name LIKE '%tolkien%') OR (authors.name LIKE '%sapkowski%')) dalam contoh?
Anda tidak bisa melakukan ini.
1 2 3 4 5 6 7 8 | |
Tapi Anda bisa melakukan ini:
1 2 3 4 5 6 7 8 9 | |
Gaya ular piton
Harap dicatat bahwa dengan gaya Python, Anda dapat menggunakan bidang yang sama sebanyak yang diperlukan.
1 2 3 4 5 6 7 8 | |
mendapatkan
Mendapatkan (*Args,*\ * kwargs) - > model
Mendapatkan baris pertama dari database yang memenuhi kondisi set kwargs.
Saat melewati args dan / atau kwarg apa pun, itu setara dengan memanggil filter (*Args,*\ * kwargs).dapatkan () jalan pintas
!!!Tip Untuk mempelajari lebih lanjut tentang filter, buka Filter.
1 | |
Dapatkan atau tidak sama sekali
Ini persis sama dengan yang dijelaskan di atas, tetapi jika tidak ada catatan database yang cocok dengan kriteria yang ditemukan, Tidak ada yang dikembalikan alih-alih pengecualian yang dilemparkan.
Memperoleh atau membuat
get_or_create(_defaults: Optional[Dict[str, Any]] = None, *args, **kwargs) -> Tuple[Model, bool]
Buat dan dapatkan kombinasi metode.
Saat melewati args dan / atau kwarg apa pun, itu setara dengan memanggil jalan pintas filter(*args, **kwargs).get_or_create()
!!!Tip Untuk mempelajari lebih lanjut tentang filter, buka Filter.
1 | |
Peringatan!!!Ketika item tertentu tidak ada, Anda harus melewati kwarg untuk semua bidang model yang diperlukan, termasuk namun tidak terbatas pada kolom kunci\ _ Primer (kecuali jika ditambahkan secara otomatis).
semuanya
all(*args, **kwargs) -> List[Optional["Model"]]
Untuk opsi filter set, kembalikan semua baris dalam database untuk model yang diberikan.
Saat melewati kwarg apa pun, itu setara dengan memanggil jalan pintas ke filter (*args,*\ * kwargs).all ()
!!!Tip Untuk mempelajari lebih lanjut tentang filter, buka Filter.
1 | |
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.
penyaring
Fungsi pemfilteran yang sama seperti di atas, tetapi memungkinkan Anda untuk menyaring objek terkait dari ujung hubungan yang lain.
!!!Untuk mempelajari lebih lanjut tentang QuerysetProxy, kunjungi bagian QuerysetProxy
mengecualikan
Fungsi pengecualian persis sama seperti di atas, tetapi memungkinkan Anda untuk menyaring objek terkait dari sisi lain hubungan.
!!!Untuk mempelajari lebih lanjut tentang QuerysetProxy, kunjungi bagian QuerysetProxy
mendapatkan
Sama seperti mendapatkan fungsi di atas, tetapi memungkinkan Anda untuk menyaring objek terkait dari ujung hubungan yang lain.
!!!Untuk mempelajari lebih lanjut tentang QuerysetProxy, kunjungi bagian QuerysetProxy
Dapatkan atau tidak sama sekali
Ini persis sama dengan yang dijelaskan di atas, tetapi jika tidak ada catatan database yang cocok dengan kriteria yang ditemukan, Tidak ada yang dikembalikan alih-alih pengecualian yang dilemparkan.
Memperoleh atau membuat
Sama persis dengan fungsi get\ _ atau\ _ di atas, tetapi memungkinkan Anda untuk memfilter objek terkait dari ujung hubungan yang lain.
!!!Untuk mempelajari lebih lanjut tentang QuerysetProxy, kunjungi bagian QuerysetProxy
semuanya
Sama seperti semua hal di atas, tetapi memungkinkan Anda untuk menyaring objek terkait dari sisi lain hubungan.
!!!Untuk mempelajari lebih lanjut tentang QuerysetProxy, kunjungi bagian QuerysetProxy
memilah
Dasar pemesanan
order_by(columns: Union[List, str, OrderAction]) -> QuerySet
Menggunakan order\ _ by (), Anda dapat mengurutkan hasil di database dengan bidang yang Anda pilih.
Anda dapat memberikan string dengan nama bidang atau daftar string dengan bidang yang berbeda.
Penyortiran dalam SQL diterapkan dalam urutan nama yang Anda berikan secara berurutan\ _ by.
!!!Tip Secara default, jika Anda tidak memberikan penyortiran atau secara eksplisit mengurutkan berdasarkan semua tombol utama
!!!Peringatan: Jika Anda mengurutkan berdasarkan model bersarang, baris yang dihasilkan tidak diurutkan berdasarkan model utama, jika tidak, mar akan menggabungkan baris anak-anak ini menjadi satu model utama.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Contoh model yang diberikan 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | |
Untuk mengurutkan berdasarkan bidang model master, cukup berikan nama bidang
Gaya Django
1 2 3 4 5 6 | |
Gaya ular piton
1 2 3 4 5 6 | |
Untuk mengurutkan model bersarang, nama bidang terpisah dengan dunder '__'.
Anda dapat mengurutkan semua jenis hubungan - > ForeignKey, Reverse Virtual FK, dan ManyToMany bidang dengan cara ini.
Gaya Django
1 2 3 4 | |
Gaya ular piton
1 2 3 4 | |
Untuk mengurutkan dalam urutan menurun, berikan tanda hubung sebelum nama bidang
Gaya Django
1 2 3 4 5 6 7 8 | |
Gaya ular piton
1 2 3 4 5 6 7 8 | |
Penyortiran default di Ormar
Karena urutan baris dalam database tidak dapat dijamin, Ormar selalu mengeluarkan urutan berdasarkan klausa sql untuk setiap pertanyaan (sebagian), bahkan jika Anda tidak memberikan pesanan sendiri.
Secara default, saat menanyai database dengan model tertentu, model diurutkan dalam urutan menaik oleh kolom\ _ kunci Primer. Jika Anda ingin mengubah perilaku default, Anda dapat melakukannya dengan memasok Pesanan\ _ dengan parameter ke konfigurasi ormar\ _.
!!! Tip Untuk mempelajari lebih lanjut tentang urutan pemilahan model, kunjungi bagian Model dokumentasi
Secara default, hubungan mengikuti urutan yang sama, tetapi Anda dapat mengubah urutan di mana model terkait dimuat selama kueri dengan menyediakan hubungan dengan pesanan\ _ berdasarkan dan\ _ pesanan\ _ terkait berdasarkan parameter.
!!! Tip Untuk membaca lebih lanjut tentang urutan pemilahan model, kunjungi bagian hubungan dokumen
Urutan\ _ berdasarkan klausa diterapkan dalam urutan berikut:
- Secara eksplisit lulus pesanan\ _ oleh () panggilan dalam kueri
- Hubungan dengan perintah\ _ oleh dan terkait\ _ perintah\ _ oleh (jika ada)
- Model ormar\ _ konfigurasi urutan objek\ _ oleh
- Kolom kunci\ _ utama model dalam urutan menaik (fallback, digunakan jika tidak ada di atas yang disediakan)
Terapkan pesanan hanya dari satu sumber ke setiap model (sehingga Anda selalu dapat menimpanya dalam satu pertanyaan).
Ini berarti bahwa jika Anda memberikan urutan eksplisit\ _ oleh untuk model dalam kueri, hubungan dan urutan pemesanan model akan dilewati.
Jika Anda memberikan hubungan satu, pemesanan model dilewati.
Terakhir, jika Anda memberikan Model, nilai default untuk\ _ key primer dilewati.
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.
Dasar pemesanan
Persis sama dengan urutan\ _ berdasarkan fungsi di atas, tetapi memungkinkan Anda untuk mengurutkan objek terkait dari sisi lain hubungan.
!!!Untuk mempelajari lebih lanjut tentang QuerysetProxy, kunjungi bagian QuerysetProxy