我正在尝试根据距离点的距离对用户列表进行排序。它确实生成了一个列表,但它没有按距离排序,尽管我在查询中指定了它。
这是我正在使用的查询。
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()
有没有人对可能出现的问题有任何疑问?
答案 0 :(得分:1)
您的代码绝对正确,我已经在我正在处理的项目上对其进行了测试,并按预期过滤和下达了订单。所以问题必须在其他地方。几点说明:
origin = GEOSGeometry(buyer.buyer_current_location.ewkt)
,它可以提供相同的结果,甚至更好,只需:origin = buyer.buyer_current_location
srid=4326
,默认情况下会使用答案 1 :(得分:0)
从django源代码中,order_by
是一种方法,它可以使用带有方向前缀的字段名称的项目(' - '或'?')或者序数,并没有把方法作为参数,因此你没有获得任何有序列表。有关详细信息,您可以查看documentation,甚至更好sourcecode。