Ответ 1
Хорошо, я провел некоторое исследование, но я не знаю, будут ли результаты полезны;)
-
Я рассмотрел теги которые они используют для проверки запросов БД, но они не дают реальных подсказок (мне).
-
Я попытался сравнить сгенерированный SQL:
У меня уже есть геоприложение с использованием PostgreSQL. Когда я выполняю этот запрос с помощью __distance_lt
:
Place.objects.filter(location__distance_lt=(p.location, D(km=1))).query.as_sql()
Я получаю этот сгенерированный SQL:
SELECT (some_fields_here)
FROM "places_place"
WHERE ST_distance_sphere("places_place"."location", %s) < 1000.0
Когда я пытаюсь использовать сделать то же самое с __dwithin
, я получаю сообщение об ошибке:
Place.objects.filter(location__dwithin=(p.location, D(km=1))).query.as_sql()
TypeError: Only numeric values of degree units are allowed on geographic DWithin queries.
Поэтому мне пришлось изменить запрос, чтобы не использовать объект D
:
Place.objects.filter(location__dwithin=(p.location, 1)).query.as_sql()
что приводит к
SELECT (some fields here)
FROM "places_place"
WHERE ST_DWithin("places_place"."location", %s, 1)
Резюме:
__dwithin
- принимает значения градуса как параметр расстояния.
- использует ST_DWithin
функцию SQL.
__distance_lt
- может принимать другие значения расстояния;).
- использует ST_distance_sphere
функцию SQL.
Btw, я получаю разные результаты с обоими запросами, но я предполагаю, что это в основном связано с тем, что я не знаю, какое значение "степени" использовать.