Tôi đã có một cuộc tranh luận về điều này với một số đồng nghiệp. Có cách nào ưa thích để lấy một đối tượng trong Django khi bạn chỉ mong đợi một đối tượng không?
Hai cách rõ ràng là:
try:
obj = MyModel.objects.get(id=1)
except MyModel.DoesNotExist:
# We have no object! Do something...
pass
Và:
objs = MyModel.objects.filter(id=1)
if len(objs) == 1:
obj = objs[0]
else:
# We have no object! Do something...
pass
Phương pháp đầu tiên có vẻ đúng hơn về mặt hành vi, nhưng sử dụng các ngoại lệ trong luồng điều khiển có thể đưa ra một số chi phí. Thứ hai là vòng xoay nhiều hơn nhưng sẽ không bao giờ đưa ra một ngoại lệ.
Bất kỳ suy nghĩ về những điều này là thích hợp hơn? Cái nào hiệu quả hơn?
QS.get()
tốt. 2. Vấn đề chi tiết: "chỉ mong đợi một" có nghĩa là luôn có 0-1 đối tượng hay có thể có hơn 2 đối tượng và trường hợp đó cũng nên được xử lý (trong trường hợplen(objs)
này là một ý tưởng tồi tệ)? 3. Đừng giả sử bất cứ điều gì về chi phí mà không có điểm chuẩn (Tôi nghĩ rằng trong trường hợptry/except
này sẽ nhanh hơn miễn là ít nhất một nửa số cuộc gọi trả lại một cái gì đó)