Saya perlu memverifikasi jika suatu objek ada dan mengembalikan objek tersebut, kemudian berdasarkan itu melakukan tindakan. Apa cara yang benar untuk melakukannya tanpa mengembalikan 404?
try:
listing = RealEstateListing.objects.get(slug_url = slug)
except:
listing = None
if listing:
django
django-views
Rasiel
sumber
sumber
if listing:
harus menjadielse:
.Jawaban:
Saya tidak akan menggunakan pembungkus 404 jika Anda tidak diberi 404. Itu adalah penyalahgunaan maksud. Tangkap saja DoesNotExist sebagai gantinya.
try: listing = RealEstateListing.objects.get(slug_url=slug) except RealEstateListing.DoesNotExist: listing = None
sumber
exists()
jika Anda perlu melakukan sesuatu dengan objek.values_list('id', flat=True)
. jika saya hanya perlu melihat apakah adalisting = RealEstateListing.objects.values_list('id', flat=True).get(slug_url=slug)
RealEstateListing.DoesNotExist
merujuk pada model, dan bukan objek itu sendiri. Mengapa tidakRealEstateListing.objects.get(slug_url=slug).DoesNotExist
?Anda juga bisa melakukan:
if not RealEstateListing.objects.filter(slug_url=slug).exists(): # do stuff...
Terkadang lebih jelas untuk menggunakan
try: except:
blokir dan di lain waktu one-linerexists()
membuat kode terlihat lebih jelas ... semua tergantung pada logika aplikasi Anda.sumber
exists()
itu tidak berhasilget()
, bukan?get()
nanti, itu akan mengirim kueri kedua ke database.try-except
lebihexists()
.listing = RealEstateListing.objects.filter(slug_url=slug).first()
sumber
if listing:
.exists()
. Saya pikir itu adalah ide yang baik dalam SO memiliki beberapa jawaban berbeda bagaimana melakukan sesuatu. Mungkin ini lebih baik bagi mereka yang juga ingin menggunakan objek tersebut jika ada. Saya tidak akan membuat aturan apa pun jika mencoba / kecuali harus dihindari atau tidak. Terkadang bagus, dan terkadang buruk misalnya jika Anda hanya ingin membuat kode yang sangat ringkas.Saya akan melakukannya sesederhana berikut:
listing = RealEstateListing.objects.filter(slug_url=slug) if listing: # do stuff
Saya tidak merasa perlu mencoba / menangkap. Jika ada potensi beberapa objek dalam hasil, maka gunakan first () seperti yang ditunjukkan oleh pengguna Henrik Heino
sumber