我有一个包含纬度和经度信息作为FloatFields的模型。

class Trader(models.Model):
    latitude = models.FloatField()
    longitude = models.FloatField()

我想按距给定位置(纬度,经度)越来越远的顺序订购此模型,但似乎无法使用F()表达式来做到这一点(使用Haversine库,我没有成功将其转换为浮点数)
Trader.objects.all().annotate(distance=haversine((lat, lon), (float(F('latitude')), float(F('longitude'))))).order_by('distance')

该查询引发以下TypeError:
float() argument must be a string or a number

我也尝试过将ExpressionWrapper与FloatField()用作output_field参数,但没有成功。

我怎样才能做到这一点?

预先感谢您的任何帮助 !

最佳答案

Func是Django 1.8中的新增功能。

from django.db.models import Func, F

class Sin(Func):
    function = 'SIN'

class Cos(Func):
    function = 'COS'

class Acos(Func):
    function = 'ACOS'

class Radians(Func):
    function = 'RADIANS'

radlat = Radians(latitude) # given latitude
radlong = Radians(longitude) # given longitude
radflat = Radians(F('latitude'))
radflong = Radians(F('longitude'))

Expression = 3959.0 * Acos(Cos(radlat) * Cos(radflat) *
                           Cos(radflong - radlong) +
                           Sin(radlat) * Sin(radflat))

Trader.objects.annotate(distance=Expression).order_by('distance')

基于this post

关于python - 按相对于给定位置的距离排序查询集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31704235/

10-11 07:41
查看更多