Apa idiom yang disarankan untuk memeriksa apakah permintaan mengembalikan hasil?
Contoh:
orgs = Organisation.objects.filter(name__iexact = 'Fjuk inc')
# If any results
# Do this with the results without querying again.
# Else, do something else...
Saya kira ada beberapa cara berbeda untuk memeriksa ini, tetapi saya ingin tahu bagaimana seorang pengguna Django yang berpengalaman akan melakukannya. Sebagian besar contoh dalam dokumen hanya mengabaikan kasus di mana tidak ada yang ditemukan ...
django
django-queryset
Niklas
sumber
sumber
list
hasil jika ada catatan. Kode di sana akan mengenai database hanya sekali. Jika mereka menggunakanexist()
ataucount()
untuk pertama memeriksa apakah akan ada catatan yang dikembalikan, mereka akan memukul database dua kali (satu kali untuk memeriksa, satu kali untuk mendapatkan catatan). Ini adalah situasi khusus. Itu tidak berarti bahwa dalam kasus umum , metode yang lebih disukai untuk mengetahui apakah permintaan akan mengembalikan catatan adalah menggunakan doif queryset:...
if not my_objects:
untuk menunjukkan bahwa ini adalah cara mereka melakukannya dalam dokumen. Semua yang lain sama sekali tidak relevan jadi saya tidak mengerti maksud Anda. Mereka juga dapat membuat seribu pertanyaan dan itu masih akan sama sekali tidak relevan karena ini bukan poin dari jawaban ini, yang saya jelaskan dengan persetujuan saya.get_object_or_404
kerjanya, bukan cara yang disukai untuk memeriksa apakah ada elemen dalam queryset. Melakukan daftar () pada queryset akan mengambil setiap objek pada queryset, yang akan lebih buruk daripada meminta dua kali jika ada banyak baris yang dikembalikan..exists()
lebih efisien jika qs tidak akan dievaluasi.Sejak versi 1.2, Django memiliki QuerySet. ada () metode yang paling efisien:
Tetapi jika Anda akan mengevaluasi QuerySet, lebih baik menggunakan:
Untuk informasi lebih lanjut baca dokumentasi QuerySet.exists () .
sumber
.get
tidak mengembalikan queryset. Ini mengembalikan suatu objek. Jadi google untuk ituJika Anda memiliki banyak objek, ini bisa (kadang-kadang) jauh lebih cepat:
Pada proyek yang saya kerjakan dengan database besar,
not orgs
400+ ms danorgs.count()
250ms. Dalam kasus penggunaan saya yang paling umum (yang ada hasilnya), teknik ini sering menurunkannya hingga di bawah 20 ms. (Satu kasus yang saya temukan, itu 6.)Bisa jadi lebih lama, tentu saja, tergantung pada seberapa jauh database harus mencari untuk menemukan hasilnya. Atau bahkan lebih cepat, jika ia menemukannya dengan cepat; YMMV.
EDIT: Ini akan sering lebih lambat daripada
orgs.count()
jika hasilnya tidak ditemukan, terutama jika kondisi yang Anda filter jarang terjadi; sebagai hasilnya, ini sangat berguna dalam fungsi tampilan di mana Anda perlu memastikan tampilan ada atau melempar Http404. (Di mana, orang akan berharap, orang-orang meminta URL yang ada lebih sering daripada tidak.)sumber
Untuk memeriksa kekosongan queryset:
atau Anda dapat memeriksa item pertama dalam queryset, jika tidak ada item itu akan kembali
None
:sumber
if orgs.exists()
ditutupi oleh jawaban yang diberikan sekitar 5 tahun sebelum ini. Satu-satunya jawaban yang dibawa ke meja yang mungkin baru adalahif orgs.first()
. (Bahkan ini masih bisa diperdebatkan: apakah ini jauh berbeda dengan melakukan yangorgs[0]
disarankan sekitar 5 tahun yang lalu juga?) Anda harus mengembangkan bagian dari jawaban itu: kapan seseorang ingin melakukan ini daripada solusi lain yang diusulkan sebelumnya?Cara paling efisien (sebelum Django 1.2) adalah ini:
sumber
Saya tidak setuju dengan predikat itu
Harus
Saya mengalami masalah yang sama dengan hasil yang cukup besar (~ hasil 150k). Operator tidak kelebihan beban di QuerySet, jadi hasilnya sebenarnya dibongkar sebagai daftar sebelum pemeriksaan dilakukan. Dalam kasus saya waktu eksekusi turun tiga pesanan.
sumber
Anda juga bisa menggunakan ini:
if(not(orgs)): #if orgs is empty else: #if orgs is not empty
sumber