Хорошо, я провел некоторое исследование, но я не знаю, будут ли результаты полезны;)
Я посмотрел на модульные тесты , которые они используют для проверки запросов к БД, но они не дают реальных подсказок (мне).
Я пытался сравнить сгенерированный 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
Когда я пытаюсь использовать do для того же с __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.
Кстати, я получаю разные результаты с обоими запросами, но я думаю, что это в основном из-за того, что я не знаю, какое значение "степени" использовать.