Geo Django 3.2 django.db.utils.OperationalError: нет такой функции: lwgeom_version
Я пытался получить список стоматологов, которые находятся поблизости от текущего местоположения пользователя.
текущее местоположение пользователя (широта и долгота) передается через параметры запроса.
Местонахождение стоматолога сохраняется в модели под названием location, где id стоматолога является внешним ключом и уникальным идентификатором. Я использовал поле PointField из drf_extra_fields.geo_fields в LocationSerializer
Я использую python 3.10 и Django 3.2.8
Модель
class Location(models.Model):
id = models.OneToOneField(Dentist, on_delete=models.CASCADE, primary_key=True)
location = models.PointField(srid=4326)
Сериализатор
from drf_extra_fields.geo_fields import PointField
class LocationSerializer(serializers.ModelSerializer):
location = PointField()
class Meta:
model = Location
fields = ['id', 'location']
Вид
class NearByDentistView(APIView):
def get(self,request):
longitude = float(self.request.query_params.get('longitude'))
latitude = float(self.request.query_params.get('latitude'))
user_location = Point(latitude,longitude,srid=4326)
queryset = Location.objects.filter(location__distance_lte=(user_location, D(km=100)))
serializer = LocationSerializer(queryset,many=True)
return Response(serializer.data)
Ответ
Какую базу данных вы используете? В сообщении об ошибке говорится, что отсутствует функция lwgeom_version.
Если вы используете SQlite, базу данных по умолчанию, используемую фреймворком Django, вам необходимо установить SpatiaLite. SpatiaLite добавляет пространственную поддержку для SQlite путем включения LWGEOM, легковесной библиотеки геометрии, которая также используется в PostGIS для добавления поддержки базы данных Postgres.
Что касается пространственного поиска, вы запрашиваете расчет кратчайшего расстояния до точек (со стандартом srid=4326 или WGS84), которые находятся на сферической/кривой поверхности (Земля). Это требует вычисления расстояний между геометриями, использующими географические системы координат, а SpatiaLite, похоже, не имеет такой возможности. Вместо этого вы можете использовать Postgres (т.е. PostGis), чтобы добавить эту возможность с лучшей производительностью, используя такие методы, как GeometryField.geography
.
Вы можете обратиться к полному API модели GeoDjango здесь.