我想獲取在給定距離內的所有作業的查詢集,這些作業至少到許多提供的位置之一,按最小距離排序,并且不顯示重復的作業。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
添加回答
舉報
0/150
提交
取消