Thường thì tôi thấy mình muốn lấy đối tượng đầu tiên từ một bộ truy vấn trong Django hoặc quay trở lại None
nếu không có nào. Có rất nhiều cách để làm điều này mà tất cả đều hoạt động. Nhưng tôi tự hỏi đó là hiệu suất cao nhất.
qs = MyModel.objects.filter(blah = blah)
if qs.count() > 0:
return qs[0]
else:
return None
Liệu kết quả này trong hai cuộc gọi cơ sở dữ liệu? Điều đó có vẻ lãng phí. Đây có phải là nhanh hơn?
qs = MyModel.objects.filter(blah = blah)
if len(qs) > 0:
return qs[0]
else:
return None
Một lựa chọn khác sẽ là:
qs = MyModel.objects.filter(blah = blah)
try:
return qs[0]
except IndexError:
return None
Điều này tạo ra một cuộc gọi cơ sở dữ liệu duy nhất, đó là tốt. Nhưng đòi hỏi phải tạo ra một đối tượng ngoại lệ rất nhiều thời gian, đó là một việc rất tốn bộ nhớ để làm khi tất cả những gì bạn thực sự cần là một bài kiểm tra if tầm thường.
Làm thế nào tôi có thể làm điều này chỉ với một cuộc gọi cơ sở dữ liệu duy nhất và không có bộ nhớ với các đối tượng ngoại lệ?
first()
và last()
tiện lợi: docs.djangoproject.com/en/dev/ref/models/querysets/#first
len()
trên các truy vấn, luôn luôn sử dụng.count()
.