Как сделать в Django запрос, упорядоченный по строке latlng
Текущая ситуация
Я получаю данные, которые содержат строки, представляющие широту местоположения... например 30.78829892811801,31.2769004988329
30.78848118485095,31.27649189363398
30.78869531217787,31.27615745128788
и т.д.
Что я пробовал
сейчас я делаю Django запрос типа ModelName.objects.all().order_by('latlng')
, но он не упорядочивает его, так как поле просто Charfield
. также преобразование его в double
не работает, так как оно содержит 2 разных двойника, разделенных запятой.
Что мне нужно сделать
Есть ли способ преобразовать эту строку в LatLng
, которую можно упорядочить по местоположению или что-то подобное?
Вы используете Postgres? Если да, то вы можете использовать ArrayField
для разделения вашей строки на массив, что может сделать ее более легко сортируемой в ORM.
from django.db.models import F, Value, DecimalField
from django.db.models.expressions import Func
from django.contrib.postgres.fields import ArrayField
latlng_arr_func = Func(
F('latlng'),
Value(","),
function='regexp_split_to_array', output=ArrayField(DecimalField())
)
ModelName.objects.annotate(latlng_arr=latlng_arr_func).order_by('-latlng_arr')
Затем вызов object.latlng_arr
должен дать список ваших значений [30.78829892811801,31.2769004988329]
.
Если это не даст вам желаемого результата, я бы предложил либо разделить данные на два десятичных поля в вашей модели (вы можете сохранить строковую версию), либо упорядочить данные с помощью Python.