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
所以我正在使用 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