为了账号安全,请及时绑定邮箱和手机立即绑定

Django 按点列表的最小距离排序

Django 按点列表的最小距离排序

RISEBY 2023-01-04 16:46:10
我想获取在给定距离内的所有作业的查询集,这些作业至少到许多提供的位置之一,按最小距离排序,并且不显示重复的作业。from django.db import modelsfrom cities.models import City    class Job(models.Model):    title = models.CharField(max_length=255)    cities = models.ManyToManyField(City)如果只有一点,我可以这样做:from django.contrib.gis.db.models.functions import Distancefrom django.contrib.gis.geos import Pointpoint = Point(x, y, srid=4326)  Job.objects.filter(cities__location__dwithin=(point, dist)) \           .annotate(distance=Distance("cities__location", point) \           .order_by('distance')但是当我有很多点时,我为过滤器构建了一个 Q 表达式,但不确定是否有一种干净的方法来注释作业到所有点的最小距离query = Q()for point in points:    query |= Q(cities__location__dwithin=(point, dist))Job.objects.filter(query).annotate(distance=Min(...)).order_by('distance')仅供参考,使用带有 PostGIS 扩展的 postgres 12.1
查看完整描述

1 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

query = Q()

distances = []

for point in points:

    query |= Q(cities__location__dwithin=(point, dist))

    distances.append(Distance("cities__location", point))


# LEAST requires 2 or more expressions, MIN works for single expression

if len(distances) == 1:

    MIN_FUNC = Min

else:

    MIN_FUNC = Least


Job.objects.filter(query).annotate(distance=MIN_FUNC(*distances)).order_by('distance')

MIN是一个聚合函数,它采用单个表达式(例如列名)并将多个输入减少为单个输出值

LEAST是一个条件表达式,它通过从任意数量的表达式列表中选择最小值来发挥作用

https://docs.djangoproject.com/en/3.0/ref/models/querysets/#min https://docs.djangoproject.com/en/3.0/ref/models/database-functions/#least


查看完整回答
反对 回复 2023-01-04
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信