在 Django 注释中执行三角运算或任何数学表达式

Perform trigonometric operations or any mathematical expression in Django annotate

我有一个 table,它有纬度和经度字段。

`

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)

`

如何在进行数据库查询时对数据执行此等效数学运算并将值存储在列表中。

根据documentation

Django supports negation, addition, subtraction, multiplication, division, modulo arithmetic, and the power operator on query expressions, using Python constants, variables, and even other expressions.

要将 sin 和 cos 等三角函数作为查询表达式执行,您需要Func() expressions在查询集中包含数据库函数

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
        )
    )
)