Я храню широту и долготу в виде поля char ("широта, долгота"). Я предпочитаю оставить это так.
Мне нужно отфильтровать результаты, чтобы показать только широту> w, широту y, долготу
Как я могу сделать это без изменений, как я храню lat, long?
Django ORM не сможет помочь вам отфильтровать это поле. Ваша схема не предназначена для того типа запроса, который вы пытаетесь.
Мои предложения:
Измените вашу схему, чтобы использовать отдельные числовые столбцы для начала. (Я знаю, что вы специально ищете вариант, который избегает этого, но это все еще правильное решение).
Добавьте два новых числовых столбца и обновляйте / устанавливайте эти столбцы при каждом изменении модели. Вам также необходимо выполнить однократное массовое обновление, чтобы установить начальные значения для всех существующих строк.
Вы можете настроить пользовательский запрос SQL, который будет проходить через каждую строку и разбивать столбец, чтобы получить отдельные числовые значения для широты и долготы и отфильтровать их. В этом случае вы в значительной степени обходите ORM и самостоятельно переходите к SQL, и вам нужно будет использовать любые методы split, доступные в вашей базе данных (пользовательские функции split, регулярные выражения и т. Д.). Запрос будет медленным.
Добавьте в вашу модель метод, который будет разбивать строку в Python и возвращать числовые данные. Чтобы выполнить какую-либо фильтрацию, используйте эти данные, вам нужно извлечь все модели из вашей базы данных (дорого) и выполнить фильтрацию в памяти (быстро, но вы потеряете преимущества SQL и / или ORM). Эта опция, вероятно, не очень хорошо масштабируется.
Удачи ...
Как упомянул один из комментаторов, вам обязательно стоит взглянуть на Geodjango , который предлагает встроенную геоинформационную поддержку. Со своей страницы: GeoDjango - это дополнение для Django, которое превращает его в глобальную веб-среду мирового класса. GeoDjango стремится максимально упростить создание географических веб-приложений, таких как сервисы на основе определения местоположения. Некоторые функции включают в себя: