Запуск формулы haversine на сервере MariaDB с помощью функции annotate() в django orm
Hii Я пытаюсь выполнить формулу Хаверсина на базе MariaDB на моей модели
.
модель такова
class MeteorologicalSite(models.Model):
lat = models.DecimalField("Latitude", max_digits=17, decimal_places=15)
lon = models.DecimalField("Longitude", max_digits=17, decimal_places=15)
class Site(models.Model):
lat = models.DecimalField("Latitude", max_digits=17, decimal_places=15)
lon = models.DecimalField("Longitude", max_digits=17, decimal_places=15)
и это функция Гаверсина
def Haversine_formula(self, site):
from django.db.models.functions import Cos, Sin, ASin, Sqrt, Radians
lat1 = Radians(site.lat)
lon1 = Radians(site.lon)
lat2 = Radians(F("lat"))
lon2 = Radians(F("lon"))
r = 6372.8
sql_haversine_formula = 2 * r * ASin(
Sqrt(
Sqrt(
Sin((lat1-lat2)/2)**2+
Cos(lat1)*
Cos(lat2)*
Sin((lon1 - lon2)/2)**2
)
)
MeteorologicalSite.objects.filter(radiation=True)\
.annotate(mycolumn=sql_haversine_formula)
и он не запускается он возвращает <django.db.models.query.QuerySet object at 0xffff57b99ca0>
.
Я пытался использовать lat и lon для 1 и 2 как десятичные непосредственно и это все еще не работает
.
Так что я понимаю, что моя проблема в том, как я использую annotate или во мне sql_haversine_formula
.
Есть ли у кого-нибудь идея, почему это не работает?
извините за мой английский
MariaDB поддерживает ST_Distance_Sphere (это формула Гаверсина). (обратите внимание на поддерживаемые версии, они довольно новые на момент написания этого сообщения)
Используя Func можно обернуть это для Django:
from django.db.models import Func
class Distance_Sphere(Func):
function = 'ST_DISTANCE_SPHERE'
Вы должны уметь использовать его в запросах.
Зачет: получен из этого ответа