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 здесь.

Вернуться на верх