Выполнять тригонометрические операции или любое математическое выражение в аннотации Django
У меня есть таблица с полями широты и долготы.
`
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 ответ
Решение
Согласно документации
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
)
)
)