Ако искате да сортирате всеки запис в тази таблица по разстояние, това ще бъде бавно, както се очаква, и няма какво да се направи (което ми е известно в този момент и ми е известно.)!
Можете да направите изчислението си по-ефективно, като следвате тези стъпки и направите някои допускания:
-
Активирайте пространствено индексиране на вашите маси. За да направите това в GeoDjango, следвайте инструкции за документ и ги монтирайте към вашия модел:
-
Сега можете да стесните заявката си с някои логически ограничения:
Пример: Моят потребител няма да търси хора на повече от 50 км от текущата му позиция.
-
Стеснете търсенето, като използвате
dwithin
пространствено търсене, което използва гореспоменатото пространствено индексиране , следователно е доста бърз. -
Накрая приложете
distance
подредете по на останалите редове.
Крайната заявка може да изглежда така:
current_location = me.location
people = People.objects.filter(
location__dwithin=(current_location, D(km=50))
).annotate(
distance=Distance('location', current_location)
).order_by('distance')
P.S: Вместо да създавате персонализиран опит за страниране, по-ефективно е да използвате методите за страниране, предоставени за django изгледите:
Или можете да използвате Django Rest Framework и да използвате нейното пагиниране: