そのテーブルのすべてのエントリを距離で並べ替える場合は、予想どおりに遅くなり、実行できることは何もありません(この時点で私が認識していることと私の知識です)。
次の手順に従い、いくつかの仮定を行うことで、計算をより効率的にすることができます。
-
空間インデックス を有効にします あなたのテーブルに。 GeoDjangoでこれを行うには、に従ってください。ドキュメントの説明 モデルに合わせます:
-
これで、いくつかの論理的な制約を使用してクエリを絞り込むことができます。
例: 私のユーザーは、現在の位置から50km以上離れた場所にいる人を探すことはありません。
-
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')
追記: カスタムのページ付け試行を作成するよりも、djangoビューに提供されているページ付け方法を利用する方が効率的です:
または、Django Rest Frameworkを使用して、そのページネーションを使用することもできます:
- ドキュメント
および
DRFページ付けに関するQ&A例