Выполнять тригонометрические операции или любое математическое выражение в аннотации Django - PullRequest
0 голосов
/ 11 января 2019

У меня есть таблица с полями широты и долготы.

`

location.objects.annotate( distance =math.fabs(math.pow((math.sin( 
                    F('latitude') - float(90.378770)) /2 )),2) + 
                    math.cos(90.378770) * math.cos( F('latitude')) * 
                    pow((math.sin(  (F('longitude') - float(-59.826830)) /2)),2) )
                   ).values_list('distance', flat=True)

`

Как выполнить эту эквивалентную математическую операцию с данными и сохранить значения в списке при выполнении запроса к базе данных.

1 Ответ

0 голосов
/ 12 января 2019

Согласно документации

Django поддерживает отрицание, сложение, вычитание, умножение, деление, арифметику по модулю и оператор степени в выражениях запросов, используя константы Python, переменные и даже другие выражения.

Для выполнения тригонометрических операций, таких как sin и cos, в качестве выражений запросов вам потребуется Func() выражений , чтобы задействовать функции базы данных внутри набора запросов

from django.db.models import F, Func


class Sin(Func):
    function = 'SIN'

class Cos(Func):
    function = 'COS'


latitude = 90.378770
longitude = -59.826830


Location.objects.annotate(
    distance=(
        Sin((F('latitude') - latitude)/2)**2 +
        (
            Cos(F('latitude'))*Cos(latitude)*
            Sin((F('longitude') - longitude)/2)**2
        )
    )
)
...