Django: фильтрация по полю (широта, долгота)

Я сохраняю широту и долготу в виде charfield («широта, долгота»). Я предпочитаю держать это таким образом.

Мне нужно отфильтровать результаты, чтобы показать только широту > w, широту ‹ x, долготу > y, долготу ‹ z.

Как я могу сделать это без изменений, как я храню лат, долго?


person Community    schedule 05.03.2010    source источник
comment
Теперь вы знаете, что Django предоставляет хороший API геолокации? geodjango.org   -  person Felix Kling    schedule 05.03.2010
comment
Если вы можете придумать стандартный SQL-способ сделать это, вы, вероятно, сможете сделать это с Django ORM, если вы не можете, то, вероятно, не сможете. Как бы вы попытались сделать это в стандартном SQL?   -  person Dominic Rodger    schedule 05.03.2010
comment
Это хорошая статья, объясняющая использование пространственной привязки в django. chicagodjango.com/blog/geo-django-quickstart   -  person Adriano Silva    schedule 27.02.2014


Ответы (2)


Django ORM не сможет помочь вам отфильтровать это поле. Ваша схема не разработана должным образом для типа запроса, который вы пытаетесь выполнить.

Мои предложения:

  • Измените свою схему, чтобы для начала использовать отдельные числовые столбцы. (Я знаю, что вы специально ищете вариант, который позволяет избежать этого, но это все же правильное решение).

  • Добавьте два новых числовых столбца и обновляйте/устанавливайте эти столбцы всякий раз, когда в модель вносятся изменения. Вам также потребуется выполнить однократное массовое обновление, чтобы установить начальные значения для всех существующих строк.

  • Вы можете настроить собственный SQL-запрос, который будет проходить через каждую строку и разделять столбец, чтобы получать отдельные числовые значения для широты и долготы и фильтровать их. В этом случае вы в значительной степени обходите ORM и переходите непосредственно к SQL самостоятельно, и вам нужно будет использовать любые методы разделения, доступные в вашей базе данных (пользовательская функция разделения, регулярное выражение и т. д.). Запрос будет медленным.

  • Добавьте в свою модель метод, который разделит строку в Python и вернет числовые данные. Чтобы выполнить какую-либо фильтрацию с использованием этих данных, вам нужно будет извлечь все модели из вашей базы данных (дорого) и выполнить фильтрацию в памяти (быстро, но вы потеряете преимущества SQL и/или ORM). Этот вариант, вероятно, не очень хорошо масштабируется.

Удачи...

person Lance McNearney    schedule 05.03.2010

Как упомянул один из комментаторов, вам обязательно стоит взглянуть на Geodjango, который предлагает встроенную поддержку геоинформации. С их страницы: GeoDjango — это надстройка для Django, которая превращает его в географическую веб-инфраструктуру мирового класса. GeoDjango стремится максимально упростить создание географических веб-приложений, таких как сервисы на основе местоположения. Некоторые функции включают в себя:

  • Поля модели Django для геометрии OGC, которые можно редактировать в админке.
  • Расширения Django ORM для запросов и обработки пространственных данных.
  • Слабосвязанные высокоуровневые интерфейсы Python для геометрических операций и форматов данных ГИС.
person DrDee    schedule 10.03.2010