Запуск формулы 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'

Вы должны уметь использовать его в запросах.

Зачет: получен из этого ответа

Вернуться на верх