Om du vill sortera varje post på den tabellen efter avstånd kommer det att gå långsamt som förväntat och det finns inget som kan göras (som jag är medveten om vid denna tidpunkt och min kunskap.)!
Du kan göra din beräkning mer effektiv genom att följa dessa steg och göra några antaganden:
-
Aktivera spatial indexering på dina bord. För att göra det i GeoDjango, följ den doc instruktioner och anpassa dem till din modell:
-
Nu kan du begränsa din fråga med några logiska begränsningar:
Ex: Min användare kommer inte att leta efter personer mer än 50 km från sin nuvarande position.
-
Begränsa sökningen med
dwithin
spatial lookup som använder ovan nämnda spatial indexing a> , därför är det ganska snabbt. -
Använd slutligen
distance
sortera efter på de återstående raderna.
Den slutliga frågan kan se ut så här:
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: Istället för att skapa ett anpassat pagineringsförsök är det mer effektivt att använda sidnumreringsmetoderna som tillhandahålls för django-vyerna:
Eller så kan du använda Django Rest Framework och använda dess paginering: