В общем, лучшая функция PostGIS для такого запроса: ST_DWithin () :
Возвращает true, если геометрия находится на указанном расстоянии друг от друга.
например. все клиенты, которые живут в пределах 1000 метров от магазина № 1:
SELECT customers.*
FROM customers, shops
WHERE ST_DWithin(customers.the_geog, shops.the_geog, 1000)
AND shop.id = 1
ST_DWithin будет использовать пространственный индекс , который вы должны были создать, и, следовательно, превзойти ST_Distance.
В Django, похоже, есть соответствующий фильтр, который называется dwithin :
Возвращает модели, в которых расстояние до геометрического поля из геометрии поиска находится на заданном расстоянии друг от друга.
Zipcode.objects.filter(poly__dwithin=(geom, D(m=5)))
Backend SQL Equivalent
PostGIS ST_DWithin(poly, geom, 5)
D (m = 5) возвращает объект расстояния длиной 5 метров
geom - это геометрия, из которой вы хотите вычислить расстояния до объектов Zipcode
dwithin () - используемая функция
poly является атрибутом геометрии объектов Zipcode
z = Zipcode(code=77096, poly='POLYGON(( 10 10, 10 20, 20 20, 20 15, 10 10))')