場所の座標にPointFieldを使用したモデルがあります。distと呼ばれる2点間の距離を計算するMySQL関数があります。extra() "select"を使用して、クエリセットで返された各オブジェクトの距離を計算します。また、extra() "where"を使用して、特定の範囲内にあるオブジェクトをフィルタリングします。このような
query = queryset.extra(
select={
"distance":"dist(geomfromtext('%s'),geomfromtext('%s'))"%(loc1, loc2)
},
where=["1 having `distance` <= %s"%(km)]
) #simplified example
これは、結果セットをカウントしようとすると、「距離」がフィールドではないというエラーが発生することを除いて、結果の取得と読み取りに問題なく機能します。もう少し詳しく調べてみると、countはextraからの「select」を無視し、「where」のみを使用しているようです。完全なSQLクエリは次のようになりますが、次のようになります。
SELECT (dist(geomfromtext('POINT (-4.6858300000000003 36.5154300000000021)'),geomfromtext('POINT (-4.8858300000000003 36.5154300000000021)'))) AS `distance`, `testmodel`.`id`, `testmodel`.`name`, `testmodel`.`email`, (...) FROM `testmodel` WHERE 1 having `distance` <= 50.0
カウントクエリははるかに短く、dist選択部分はありません。
SELECT COUNT( `testmodel`.`id`) FROM `testmodel` WHERE 1 having `distance` <= 50.0
論理的には、「距離」が定義されていないため、MySQLはエラーを出します。カウントのための追加の選択を含める必要があることをDjangoに伝える方法はありますか?
アイデアをありがとう!