Nếu bạn muốn sắp xếp mọi mục nhập trên bảng đó theo khoảng cách thì nó sẽ chậm như mong đợi và không thể làm được gì (điều đó tôi biết tại thời điểm này và kiến thức của tôi.)!
Bạn có thể làm cho việc tính toán của mình hiệu quả hơn bằng cách làm theo các bước sau và đưa ra một số giả định:
-
Bật lập chỉ mục không gian trên bàn của bạn. Để làm điều đó trong GeoDjango, hãy làm theo hướng dẫn tài liệu và phù hợp với mô hình của bạn:
-
Bây giờ bạn có thể thu hẹp truy vấn của mình bằng một số ràng buộc logic:
Ví dụ: Người dùng của tôi sẽ không tìm kiếm những người cách vị trí hiện tại của anh ta hơn 50 km.
-
Thu hẹp tìm kiếm bằng cách sử dụng
dwithin
tra cứu không gian sử dụng lập chỉ mục không gian , do đó nó khá nhanh. -
Cuối cùng áp dụng
distance
sắp xếp theo thứ tự trên các hàng còn lại.
Truy vấn cuối cùng có thể giống như sau:
current_location = me.location
people = People.objects.filter(
location__dwithin=(current_location, D(km=50))
).annotate(
distance=Distance('location', current_location)
).order_by('distance')
Tái bút: Thay vì tạo một nỗ lực phân trang tùy chỉnh, sẽ hiệu quả hơn nếu sử dụng các phương pháp phân trang được cung cấp cho các chế độ xem django:
Hoặc bạn có thể sử dụng Django Rest Framework và sử dụng phân trang của nó: