фильтровать по расстоянию с помощью точечного поля

Я хочу установить фильтр по расстоянию, используя поле точки

у меня есть модельный магазин

class Shop(models.Model):
     distance = models.PositiveIntegerField(null=True)
     Shop_location = models.PointField(null=True)

магазин может определить расстояние от своего местоположения, при котором его идентификатор показывается другому пользователю. когда пользователь делится своим местоположением и пользователь может увидеть магазин, который удовлетворяет условию. условие состоит в том, что расстояние, рассчитанное между пользователем и магазином, меньше или равно расстоянию, указанному магазином


person Sarthak tiwari    schedule 08.06.2020    source источник
comment
Также похоже: - stackoverflow. com/questions/51506916/ - stackoverflow.com/questions/32609729/   -  person John Moutafis    schedule 09.06.2020
comment
но я не могу понять, пожалуйста, сделайте код для меня. У меня есть только один магазин моделей, и я хочу сделать шаблон для пользователя с картой, где они разделяют местоположение.   -  person Sarthak tiwari    schedule 10.06.2020
comment
Расстояние расположения фильтра Django с динамическим радиусом работает, когда сохраняются оба данных, но в моем случае я хочу использовать одно сохранение данных, а одно случайное, оно не сохраняется   -  person Sarthak tiwari    schedule 10.06.2020


Ответы (1)


я не проверял это, но думаю, что это может сработать
вы можете сделать это с помощью Distance объекта и поиска, geodjango doc хорошо это объясняет. также вам нужен объект django F, чтобы получить значение расстояния каждой строки. я также предположил, что ваше расстояние, которое вы сохраняете в модели магазина, находится в kilometer или km

from django.db.models import F
from django.contrib.gis.measure import D


user_location = Point() # your user location should be a standard `Point` object as well

# F object will get each shop's distance
# this query will get you all shops that their distance is less than or equal 
# of the distance between shop_location and user_location
in_distance_shops = Shop.objects.filter(shop_location__distance_lte=(user_location, D(km=F("distance"))))



person mahyar    schedule 08.06.2020
comment
как пользователь может поделиться текущим местоположением, тогда магазин распечатает - person Sarthak tiwari; 08.06.2020
comment
Обычно пользователь опубликует долготу и широту местоположения, после чего вы получите эти координаты и передадите их объекту Point django, после чего вы сможете использовать этот точечный объект. - person mahyar; 08.06.2020
comment
Я получаю сообщение об ошибке TypeError: аргумент float() должен быть строкой или числом, а не 'F' - person Sarthak tiwari; 08.06.2020