ฉันต้องการตรวจสอบว่ามีวัตถุอยู่หรือไม่และส่งคืนวัตถุจากนั้นขึ้นอยู่กับการดำเนินการนั้น วิธีใดที่ถูกต้องในการทำโดยไม่ส่งคืน 404
try:
listing = RealEstateListing.objects.get(slug_url = slug)
except:
listing = None
if listing:
ฉันต้องการตรวจสอบว่ามีวัตถุอยู่หรือไม่และส่งคืนวัตถุจากนั้นขึ้นอยู่กับการดำเนินการนั้น วิธีใดที่ถูกต้องในการทำโดยไม่ส่งคืน 404
try:
listing = RealEstateListing.objects.get(slug_url = slug)
except:
listing = None
if listing:
if listing:
else:
คำตอบ:
ฉันจะไม่ใช้กระดาษห่อ 404 ถ้าคุณไม่ได้รับ 404 นั่นเป็นการใช้เจตนาในทางที่ผิด เพียงจับ DoesNotExist แทน
try:
listing = RealEstateListing.objects.get(slug_url=slug)
except RealEstateListing.DoesNotExist:
listing = None
exists()
ถ้าคุณต้องทำอะไรกับวัตถุ
values_list('id', flat=True)
ผมชอบที่จะเพิ่ม ถ้าฉันต้องการเพียงแค่ดูว่ามีอยู่หรือไม่listing = RealEstateListing.objects.values_list('id', flat=True).get(slug_url=slug)
RealEstateListing.DoesNotExist
คือการอ้างอิงถึงโมเดลไม่ใช่ตัววัตถุ ทำไมมันไม่RealEstateListing.objects.get(slug_url=slug).DoesNotExist
?
คุณยังสามารถทำ:
if not RealEstateListing.objects.filter(slug_url=slug).exists():
# do stuff...
บางครั้งมันชัดเจนกว่าที่จะใช้try: except:
บล็อกและบางครั้งซับเดียวexists()
ทำให้โค้ดดูชัดเจนขึ้น ... ทั้งหมดขึ้นอยู่กับตรรกะแอปพลิเคชันของคุณ
exists()
ไม่ได้get()
ใช่มั้ย?
get()
ภายหลังระบบจะส่งแบบสอบถามที่สองไปยังฐานข้อมูล
try-except
exists()
listing = RealEstateListing.objects.filter(slug_url=slug).first()
if listing:
.exists()
. ฉันคิดว่ามันเป็นความคิดที่ดีใน SO ที่จะมีคำตอบที่แตกต่างกันในการทำสิ่งต่างๆ อาจจะดีกว่าสำหรับผู้ที่ต้องการใช้วัตถุด้วยหากมีอยู่ ฉันจะไม่ทำกฎใด ๆ หากพยายาม / ยกเว้นควรหลีกเลี่ยงหรือไม่ บางครั้งก็ดีและบางครั้งก็ไม่ดีเช่นหากคุณต้องการสร้างโค้ดที่กะทัดรัดมาก
ฉันจะทำง่ายๆดังนี้:
listing = RealEstateListing.objects.filter(slug_url=slug)
if listing:
# do stuff
ฉันไม่เห็นความจำเป็นในการลอง / จับ หากผลลัพธ์มีหลายวัตถุให้ใช้ first () ตามที่แสดงโดยผู้ใช้ Henrik Heino