2

我正在尝试进行数据库查询,该查询为我提供了 20 个按距离排序的最近用户(最接近的用户)我正在执行以下操作

distance_mi = 100

origin = GEOSGeometry('SRID=4326;'+ 'POINT('+ str(user_profile.current_location.x)+' '+str(user_profile.current_location.y)+')')

close_users = UserProfile.objects.exclude(user = user).filter(current_location__distance_lte=(origin, D(mi=distance_mi))).distance(origin).order_by('-distance')[:20]

但这会返回 3 个用户(这是正确的),但第一个用户在 0 英里之外,第二个在 8 英里之外,第三个在 0 英里之外,因为我将 8 英里用户排除在最后。

我不确定我在这方面做错了什么。

此外,UserProfile具有以下型号

class UserProfile(models.Model):
    # This field is required.
    user = models.OneToOneField(User)
    # Other fields here
    current_location = models.PointField(null = True)
    seller_current_location = models.PointField(null = True)
    objects = models.GeoManager()
    def __unicode__(self):
        return u'%s' % (self.user.get_full_name())
4

1 回答 1

2

由于您UserProfile包含多个地理字段,因此您应该使用 的field_name参数指定您想要的一个distance()

UserProfile.objects.exclude(user=user).filter(current_location__distance_lte=(origin, D(mi=distance_mi))).distance(origin, field_name='current_location').order_by('distance')[:20]

有关更多详细信息,请参阅文档

于 2013-08-12T21:38:18.333 回答