आप raw()
पोस्टगिस का उपयोग करने के लिए एसक्यूएल क्वेरी order_by
ऑपरेटर:
-
<->
जो अंतर-वस्तु दूरी की गणना करने के लिए बाउंडिंग बॉक्स के केंद्रों का उपयोग करके निकटतम पड़ोसी प्राप्त करता है। -
<#>
जो इंटर-ऑब्जेक्ट दूरियों की गणना करने के लिए स्वयं बाउंडिंग बॉक्स का उपयोग करके निकटतम पड़ोसी प्राप्त करता है।
आपके मामले में जो आप चाहते हैं वह लगता है <->
ऑपरेटर, इस प्रकार कच्ची क्वेरी:
knn = Person.objects.raw(
'SELECT * FROM myapp_person
ORDER BY location <-> ST_SetSRID(ST_MakePoint(%s, %s),4326)',
[location.x, location.y]
)[:k]
स्वयं की मूर्खता के कारण संपादित करें: आप [:k]
. को छोड़ सकते हैं जोड़ने के लिए LIMIT 1
कच्ची SQL क्वेरी पर। (जैसा मैंने किया दोनों का उपयोग न करें!)
आपके अन्य प्रश्न का उत्तर देने की प्रक्रिया में:-table-in-geodjango/">geodjango में दूरी (संपूर्ण तालिका) के आधार पर ऑर्डर करना कितना प्रभावी है , एक और समाधान संभव हो सकता है:
spatial indexing
enabling को सक्षम करके और तार्किक बाधाओं के माध्यम से अपनी क्वेरी को कम करना (जैसा कि समझाया गया है -entire-table-in-geodjango/45433627#45433627">मेरे जवाब में
उपरोक्त से जुड़े प्रश्न में) आप बहुत तेज़ KNN . प्राप्त कर सकते हैं क्वेरी इस प्रकार है:
current_location = me.location
people = People.objects.filter(
location__dwithin=(current_location, D(km=50))
).annotate(
distance=Distance('location', current_location)
).order_by('distance')[:k]