order_by('distance')无法按预期工作

时间:2014-06-15 19:18:32

标签: django geolocation gis geospatial geodjango

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

这是我正在使用的查询。

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

有没有人对可能出现的问题有任何疑问?

2 个答案:

答案 0 :(得分:1)

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

  • 我希望你将PostgreSQL与PostGIS一起使用,因为"扩展"知名文本仅适用于PostGIS
  • 第一行可以替换为:origin = GEOSGeometry(buyer.buyer_current_location.ewkt),它可以提供相同的结果,甚至更好,只需:origin = buyer.buyer_current_location
  • 您不需要指定srid=4326,默认情况下会使用

答案 1 :(得分:0)

从django源代码中,order_by是一种方法,它可以使用带有方向前缀的字段名称的项目(' - '或'?')或者序数,并没有把方法作为参数,因此你没有获得任何有序列表。有关详细信息,您可以查看documentation,甚至更好sourcecode