【发布时间】:2020-09-29 12:21:47
【问题描述】:
我想获取在给定距离内至少到许多提供位置之一的所有作业的查询集,按最小距离对它们进行排序,并且不显示重复的作业。
from django.db import models
from 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 Distance
from django.contrib.gis.geos import Point
point = 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
【问题讨论】:
标签: python django postgresql django-queryset postgis