按相对于给定位置的距离对queryset排序

2024-04-26 22:57:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模型,其中包含纬度和经度信息作为浮动字段。在

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

我想通过增加与给定位置(lat,lon)的距离来排序这个模型,但似乎不能使用F()表达式(使用haversine库,我还没有成功地将它们转换成浮点数)

^{pr2}$

此查询引发以下类型错误:

float() argument must be a string or a number

我还尝试使用ExpressionWrapper和FloatField()作为输出字段参数,但没有成功。在

我怎么能做到呢?在

提前感谢您的帮助!在


Tags: 模型信息距离model排序modelsclasslon
2条回答

Func是django1.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。在

请注意,https://docs.djangoproject.com/en/1.8/ref/models/expressions/#f-expressions“生成SQL”和float(“generate SQL”)没有意义generate sql“==使用生成的sql中的字段值。你必须用一些知道如何将自己转换成sql的东西来改变haversine函数,它可以进行大量的计算,并且是django的朋友。。。在

你一定要有创造性才能优雅地解决这个问题。如果可以编写sql来进行计算,那么原始sql似乎是获得结果的最快方式。考虑使用地理扩展,例如postgis。如果您有一组小而固定的输入(lat,lon)组合或“预计算估计”来限制查询结果计数并用python进行计算和排序,那么可以考虑预计算。在

相关问题 更多 >