django中基于距离的排序

distance based ordering in django

所以我正在使用 django 并在注册时获取用户的位置。

然后我在应用程序的首页显示这些用户,但按距离排序,即离登录用户最近的在顶部,依此类推。

现在我正在做的是使用 django ORM 提供的一些注释(等)函数在后端根据距离对它们进行排序。

sortedQueryset = self.get_queryset().annotate(distance=Distance(
                'coords', user.coords, spheroid=True)).order_by('distance')

其中'coords'是db中存储点(位置)的列,user.coords是登录用户的点(坐标)。

现在,为了仅从数据库中获取前 100 个用户(比如说),我可以这样做;

sortedQueryset = self.get_queryset().annotate(distance=Distance(
                'coords', user.coords, spheroid=True)).order_by('distance')[:100]

但它怎么想,它仍然抓取所有行,按距离排序,然后得到 100 行。假设我们在 db 中有 100 万个用户,那么它总是必须获取所有这些用户,然后对它们进行排序,然后只获取 100 个。

我认为这是很多工作过度(也许我错了或者这是唯一的方法,因为我必须按距离排序并且这也取决于登录用户,谁最近谁最远).

如有任何建议,我们将不胜感激。谢谢!

其实你所做的只是对的。这不会切入 Python 而是将其限制在数据库查询本身中。因此它不会获取所有结果并将其切片,而是对数据库运行 LIMIT 查询。请参阅文档。

https://docs.djangoproject.com/en/dev/topics/db/queries/#limiting-querysets