Jeśli chcesz posortować każdy wpis w tej tabeli według odległości, będzie to przebiegało powoli zgodnie z oczekiwaniami i nie można nic zrobić (o czym jestem świadomy w tym momencie i posiadam wiedzę).
Możesz zwiększyć wydajność swoich obliczeń, wykonując następujące kroki i przyjmując pewne założenia:
-
Włącz indeksowanie przestrzenne na twoich stołach. Aby to zrobić w GeoDjango, postępuj zgodnie z instrukcje dotyczące dokumentów i dopasuj je do swojego modelu:
-
Teraz możesz zawęzić zapytanie, stosując pewne ograniczenia logiczne:
Przykład: Mój użytkownik nie będzie szukał osób znajdujących się dalej niż 50 km od jego aktualnej pozycji.
-
Zawęź wyszukiwanie za pomocą
dwithin
wyszukiwanie przestrzenne, które wykorzystuje wspomniane powyżej indeksowanie przestrzenne , dlatego jest dość szybki. -
Na koniec zastosuj
distance
uporządkuj według pozostałych wierszy.
Ostateczne zapytanie może wyglądać tak:
current_location = me.location
people = People.objects.filter(
location__dwithin=(current_location, D(km=50))
).annotate(
distance=Distance('location', current_location)
).order_by('distance')
PS: Zamiast tworzyć niestandardową próbę stronicowania, bardziej efektywne jest wykorzystanie metod stronicowania dostarczonych dla widoków django:
Możesz też użyć Django Rest Framework i użyć jego paginacji: