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() 在 PythonAnywhere 上不适合我