यदि आप उस तालिका की प्रत्येक प्रविष्टि को दूरी के आधार पर छाँटना चाहते हैं तो यह अपेक्षा के अनुरूप धीमी होगी और ऐसा कुछ भी नहीं किया जा सकता है (जिसकी जानकारी मुझे इस समय और मेरी जानकारी से है।)!
आप इन चरणों का पालन करके और कुछ अनुमान लगाकर अपनी गणना को अधिक कुशल बना सकते हैं:
-
स्थानिक अनुक्रमण सक्षम करें अपनी मेजों पर। GeoDjango में ऐसा करने के लिए, का अनुसरण करें। दस्तावेज़ निर्देश और उन्हें अपने मॉडल में फ़िट करें:
-
अब आप कुछ तार्किक बाधाओं के साथ अपनी क्वेरी को सीमित कर सकते हैं:
पूर्व: मेरा उपयोगकर्ता अपनी वर्तमान स्थिति से 50 किमी से अधिक दूरी के लोगों की तलाश नहीं करेगा।
-
dwithin
स्थानिक लुकअप जो ऊपर उल्लिखित स्थानिक अनुक्रमण का उपयोग करता है ए> , इसलिए यह बहुत तेज़ है। -
अंत में
दूरी
लागू करें शेष पंक्तियों के अनुसार क्रमित करें।
अंतिम क्वेरी इस तरह दिख सकती है:
current_location = me.location
people = People.objects.filter(
location__dwithin=(current_location, D(km=50))
).annotate(
distance=Distance('location', current_location)
).order_by('distance')
पी.एस: एक कस्टम पेजिनेशन प्रयास बनाने के बजाय, django विचारों के लिए प्रदान की गई पेजिनेशन विधियों का उपयोग करना अधिक कुशल है:
या आप Django Rest Framework का उपयोग कर सकते हैं और इसके पेजिनेशन का उपयोग कर सकते हैं: