第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Django 按點(diǎn)列表的最小距離排序

Django 按點(diǎn)列表的最小距離排序

RISEBY 2023-01-04 16:46:10
我想獲取在給定距離內(nèi)的所有作業(yè)的查詢集,這些作業(yè)至少到許多提供的位置之一,按最小距離排序,并且不顯示重復(fù)的作業(yè)。from django.db import modelsfrom cities.models import City    class Job(models.Model):    title = models.CharField(max_length=255)    cities = models.ManyToManyField(City)如果只有一點(diǎn),我可以這樣做: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')但是當(dāng)我有很多點(diǎn)時,我為過濾器構(gòu)建了一個 Q 表達(dá)式,但不確定是否有一種干凈的方法來注釋作業(yè)到所有點(diǎn)的最小距離query = Q()for point in points:    query |= Q(cities__location__dwithin=(point, dist))Job.objects.filter(query).annotate(distance=Min(...)).order_by('distance')僅供參考,使用帶有 PostGIS 擴(kuò)展的 postgres 12.1
查看完整描述

1 回答

?
慕虎7371278

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超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是一個聚合函數(shù),它采用單個表達(dá)式(例如列名)并將多個輸入減少為單個輸出值

LEAST是一個條件表達(dá)式,它通過從任意數(shù)量的表達(dá)式列表中選擇最小值來發(fā)揮作用

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


查看完整回答
反對 回復(fù) 2023-01-04
  • 1 回答
  • 0 關(guān)注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號