Simple đủ ví dụ - Tôi có một chút mã Django rằng bắt đầu với một queryset ...Tại thời điểm những gì được ngoại lệ huy động khi sử dụng ORM Django
queryset = MyModel.objects.all()
Sau đó nó thực hiện lọc khác nhau, tùy thuộc vào một số cấu hình tùy chọn ...
if something:
queryset = self.queryset.filter(foo=some_foo)
if another_thing:
queryset = self.queryset.filter(bar=some_bar)
Và cuối cùng nó thực hiện các tra cứu ...
try:
obj = queryset.get()
except ObjectDoesNotExist:
raise ValidationError('Does not exist')
Bây giờ, hãy nguyên nhân của cách linh hoạt mà bộ lọc cần phải xảy ra, có thể là các biến số some_foo
hoặc some_bar
có thể không đúng loại (ví dụ: chúng tôi có thể kết thúc bằng một chuỗi rỗng cố gắng lọc theo trường số nguyên.) vì vậy, mã này có thể kết thúc bằng cách tăng TypeError
hoặc ValueError
.
Điều đó tốt và tôi có thể xử lý trường hợp một cách phù hợp, nhưng điều không rõ ràng đối với tôi từ hợp đồng ORM, là tại điểm nào tôi có thể mong đợi các ngoại lệ đó được nêu ra.
- nó sẽ xảy ra trên báo cáo kết quả
.filter()
? ... - ... hoặc trên báo cáo kết quả
.get()
? ... - ... hoặc là trong underspecified, và tôi xử lý nó như thể xảy ra trên một trong hai? (Ví dụ: có lẽ tùy thuộc vào việc thực hiện phụ trợ cơ sở dữ liệu?)
có thể tôi đang thiếu điều gì đó nhưng tôi cần phải hỏi: tại sao bạn gọi điện thoại nhận được trên queryset? filter() và get() có các mục đích khác nhau và cả hai đều thực hiện một truy vấn. và bộ lọc() là truy vấn đầu tiên -> lỗi Loại/Giá trị sẽ được tăng lên trong quá trình lọc. bạn sẽ không đạt được get() –
Lưu ý: Được rồi, tôi có thể thấy trong trường hợp cụ thể này có vẻ như được nêu lên bởi câu lệnh '.get()' (đó là những gì tôi mong đợi) nhưng không rõ liệu tôi có thể an toàn không dựa vào hành vi này để nhất quán. –
@SamueleMattiuzzo Các câu lệnh lọc có thể bị xâu chuỗi. '.get()' cuối cùng là bit thực hiện tra cứu một đối tượng đơn lẻ, được cung cấp truy vấn. –