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

Posted

技术标签:

【中文标题】order_by(\'-distance\') 没有按预期工作【英文标题】:order_by('-distance') not working as expectedorder_by('-distance') 没有按预期工作 【发布时间】:2013-08-12 18:09:28 【问题描述】:

我正在尝试进行一个数据库查询,该查询为我提供了 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())

【问题讨论】:

UserProfile 是否包含除current_location 之外的地理字段?如果是这样,distance() 可能使用的字段与您预期的不同。请参阅 field_name 参数上的 docs distance() 另外,如果您想要“最近的优先”,您应该在'distance' 上订购。 (尽管这无法解释您报告的无序结果。) @KevinHenry 是的,它有两个 PointFields 请查看更新,我应该为两者指定 field_names 吗? @KevinHenry 是的,我刚刚添加了distance(origin, field_name='current_location') 并修复了它。是的,我将order_by('-distance') 更改为order_by('distance') 非常感谢!请将此作为解决方案记下来,以便我接受它作为正确答案。 【参考方案1】:

由于您的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]

有关详细信息,请参阅documentation。

【讨论】:

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

Django:Order_by 多个字段

SQL ORDER BY distance 无法正常工作

Flask 学习-97.Flask-SQLAlchemy 排序 order_by()

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

Django order_by() 没有正确排序

queryset,union,order_by 在带注释的字段上