2010-01-26 46 views
38

Tất cả thời gian ở Django tôi thấy DoesNotExist được nâng lên như trong db.models.fields.related.py. Không phải ObjectDoesNotExist được xác định trong django.core.exceptions, nhưng chỉ DoesNotExist. Trường hợp ngoại lệ này được định nghĩa ở đâu, hoặc tôi không hoàn toàn hiểu ngoại lệ? Tôi đã kiểm tra rằng nó không có trong trường hợp ngoại lệ (ít nhất là không phải là tôi biết). Tôi bối rối rõ ràng.Django: "DoesNotExist" ở đâu?

Lưu ý: Nó cũng được cung cấp miễn phí, như một thuộc tính của một cá thể lớp con mô hình, như `self.someforeignkey.DoesNotExist. Sao có thể như thế được?

Trả lời

54

DoesNotExist được ghi chép lại here:

Các DoesNotExist ngoại lệ được thừa hưởng từ django.core.exceptions.ObjectDoesNotExist, vì vậy bạn có thể nhắm mục tiêu nhiều ngoại lệ DoesNotExist.

để bạn có thể hoàn toàn tốt sử dụng except ObjectDoesNotExist: và bắt tất cả các mô hình cụ thể DoesNotExist trường hợp ngoại lệ có thể được nâng lên trong mệnh đề try, hoặc sử dụng except SomeSpecificModel.DoesNotExist: khi bạn muốn cụ thể hơn.

Nếu bạn đang tìm kiếm các vị trí cụ thể trong mã nguồn của Django nơi thuộc tính này sẽ được thêm vào mô hình lớp học, thấy here, dòng 34-37:

# Create the class. 
new_class = type.__new__(cls, name, bases, {'__module__': attrs.pop('__module__')}) 
new_class.add_to_class('_meta', Options(attrs.pop('Meta', None))) 
new_class.add_to_class('DoesNotExist', types.ClassType('DoesNotExist', (ObjectDoesNotExist,), {})) 
+0

Cảm ơn Alex. Tôi không biết Django đã có phương thức add_to_class() đó. Tôi đã tìm kiếm tài liệu trong Komodo cho 'class DoesNotExist' và đang đập đầu vào tường. – orokusaki

+0

Trừ khi có nhu cầu phân biệt lớp nào là nguồn gốc của 'không tồn tại '(rất hiếm trong kinh nghiệm của tôi), nó an toàn hơn cho người dùng' ObjectDoesNotExist'. – Marcin

+3

Tôi nghĩ rằng trong hầu hết mọi tình huống, nó tốt hơn 100% để biết ngoại lệ nào được nêu ra. Một tấm chăn 'ngoại trừ ObjectDoesNotExist:' không tốt hơn 'ngoại trừ:'. Vì bạn không biết điều gì đã gây ra ngoại lệ, bạn sẽ có khả năng sẽ hành động theo thông tin xấu. – orokusaki

7

DoesNotExist, giống như MultipleObjectsReturned, là thuộc tính trên lớp mô hình. Nó được thêm vào mô hình khi mô hình được tạo ra.

EDIT: metaclass chịu trách nhiệm cho quá trình này là ModelBase (django.db.models.base) và bạn có thể xem nó để xem những gì đang xảy ra.