order_by('distance') 没有按预期工作

Posted

技术标签:

【中文标题】order_by(\'distance\') 没有按预期工作【英文标题】:order_by('distance') not working as expectedorder_by('distance') 没有按预期工作 【发布时间】:2014-06-15 19:18:32 【问题描述】:

我正在尝试根据与某个点的距离对用户列表进行排序。它确实会生成一个列表,但它不是按距离排序的,尽管我在查询中指定了它。

这是我正在使用的查询。

origin = GEOSGeometry('SRID=4326;'+ 'POINT('+ str(buyer.buyer_current_location.x)+' '+str(buyer.buyer_current_location.y)+')')
close_sellers = Seller.objects.exclude(profile__user = user).filter(seller_current_location__distance_lte=(origin, D(mi=distance_mi)),profile__user__is_active = True).distance(origin, field_name='seller_current_location').order_by('distance')[:20]

这些是我拥有的模型

class Buyer(models.Model):
    # This field is required.
    profile = models.ForeignKey(UserProfile,unique=True)
    # Other fields here
    screen_name = models.CharField(max_length = 200,default='buyer')
    buyer_current_location = models.PointField(null = True, srid=4326)
    objects = models.GeoManager()

class Seller(models.Model):
    # This field is required.
    profile = models.ForeignKey(UserProfile,unique=True)
    # Other fields here
    seller_current_location = models.PointField(null = True, srid=4326)
    objects = models.GeoManager()

有人知道可能出了什么问题吗?

【问题讨论】:

【参考方案1】:

您的代码绝对正确,我已经在我正在处理的项目中对其进行了测试,并且它按预期过滤和排序。所以问题必须在其他地方。几点说明:

我希望您将 PostgreSQL 与 PostGIS 一起使用,因为“扩展的”众所周知的文本仅适用于 PostGIS 第一行可以替换为:origin = GEOSGeometry(buyer.buyer_current_location.ewkt),这将给出相同的结果,甚至更好,只需:origin = buyer.buyer_current_location srid=4326不用指定,默认使用

【讨论】:

这很奇怪,一旦我将其更改为 origin = Buyer.buyer_current_location 它就开始正常工作了。我想知道我一开始这样做的方式可能出错了。非常感谢阿列克谢! Alexey 实际上,这并没有解决它。 最奇怪的是,当我将 distance_mi 更改为 1 英里窗台时,它会向我显示 1 英里半径之外的字段 您确定所有配置都正确吗?您在问题中的代码是正确的,似乎地理空间查询不起作用。您是否创建了空间数据库? docs.djangoproject.com/en/1.6/ref/contrib/gis/tutorial/… Alexey,是的,我仔细检查了。我创建了数据库并将其添加到 DATABASES['default'] 中,还在已安装的应用程序中添加了 'django.contrib.gis'。【参考方案2】:

来自 django 源代码,order_by 是一种方法,它采用可能带有方向前缀('-' 或 '?')的字段名称或序数的项目,它不采用方法作为参数,因此你没有得到任何有序列表。详情可以查看documentation,更好的是sourcecode。

【讨论】:

ruddra,在这种情况下,距离是 order_by,请看这个***.com/questions/19703975/django-sort-by-distance 我明白了。好吧,你是对的。我已经搜索并找到了更多关于 order_by 距离及其 geodjango 功能的参考资料。对不起。

以上是关于order_by('distance') 没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

App.objects.get(foo=bar) 没有 'order_by' 属性

Django order_by() 没有正确排序

获取查询集的当前 order_by 排序

Django order_by() 在 PythonAnywhere 上不适合我

mysql中的ST_Distance_Sphere没有给出两个位置之间的准确距离

MySQL 函数 ST_Distance_Sphere 没有使用 Haversine 公式?