2009-03-12 14 views
63

về cơ bản chỉ xác minh nếu một đối tượng tồn tại và trả về đối tượng. sau đó dựa trên đó thực hiện hành động. Tôi tự hỏi whats đúng cách để làm điều đó mà không trả lại một 404?cách nào đúng để xác thực nếu một đối tượng tồn tại trong chế độ xem django mà không trả về 404?

try: 
    listing = RealEstateListing.objects.get(slug_url = slug) 
except: 
    listing = None 

if listing: 
+0

Rasiel, tôi có thể đề xuất bạn xem xét chấp nhận câu trả lời khác không? Nó có vẻ là cách chính xác để làm điều này, và đã được upvoted khá nhiều hơn một câu trả lời được chấp nhận. – Azendale

+0

Tôi có thể xem xét nó, tuy nhiên tồn tại đã được giới thiệu trong Django 1.2 được phát hành ngày 17 tháng 5 năm 2010, Nếu bạn nhận thấy câu hỏi của tôi đã được gửi trong 09 ... đây là câu trả lời đúng lúc đó. Nếu Exists() bây giờ được coi là cách tốt nhất để làm điều đó, tôi đoán nó sẽ là ngữ nghĩa chính xác để chọn câu trả lời thứ hai, phải không? – Rasiel

+0

Rasiel, nó có ý nghĩa rằng đó là câu trả lời đúng lúc đó. Nhưng các trang web stackoverflow dường như càng nhiều về việc xây dựng một bộ câu hỏi tốt/chính thức với câu trả lời tốt nhất khi các trang web đang tìm kiếm giải pháp cho các vấn đề của mọi người. Do đó đề nghị của tôi để chọn những gì bây giờ là "chính thức chính xác" câu trả lời. – Azendale

Trả lời

86

Tôi sẽ không sử dụng trình bao bọc 404 nếu bạn không được cung cấp 404. Đó là lạm dụng mục đích. Thay vào đó, chỉ cần nắm bắt được DoesNotExist.

try: 
    listing = RealEstateListing.objects.get(slug_url=slug) 
except RealEstateListing.DoesNotExist: 
    listing = None 
+0

+1: Tôi sẽ sử dụng nó thay vì 404 wrapper. – Tiago

+0

+1: Vâng, đây là giải pháp tốt hơn so với chấp nhận, nếu bạn không muốn 404. –

+0

yap, đây có vẻ là giải pháp tốt hơn – Rasiel

141

Bạn cũng có thể làm

if not RealEstateListing.objects.filter(slug_url=slug).exists(): 
    do stuff... 

Đôi khi nó rõ ràng hơn để sử dụng thử: trừ: block và thời điểm khác một liner tồn tại() làm cho mã tìm kiếm rõ ràng hơn ... tất cả phụ thuộc vào bạn logic ứng dụng.

+6

.exists() nhanh hơn: https: //docs.djangoproject .com/vi/dev/ref/models/querysets/# tồn tại – fjsj

+5

đây là cách tốt hơn và nên có câu trả lời – Jharwood

+0

Tôi thích điều này hơn cả cách thử/ngoại lệ quá – robbyt

2
listing = RealEstateListing.objects.filter(slug_url=slug).first() 
+0

Đây là giải pháp tốt nhất nếu bạn cần sử dụng đối tượng tiềm năng sau này, vì nó chỉ yêu cầu một nhiệm vụ và tránh phải sử dụng khối thử/ngoại trừ. Lưu ý rằng bạn có thể kiểm tra sự tồn tại sau này chỉ đơn giản bằng 'if listing:' –

Các vấn đề liên quan