Para utilizar o campo PointField (com o sqlite3), que armazena latitude e longitude no django, você precisa instalar no linux:
sudo apt install libsqlite3-mod-spatialite
sudo apt install gdal-bin
Depois você precisa instalar o pacote "django-extra-fields" para permitir você usar no DRF a serialização correta:
pip install django-extra-fields
Além de configurar no "settings.py":
INSTALLED_APPS = [
[...]
'django.contrib.gis',
[...]
]
[...]
SPATIALITE_LIBRARY_PATH = 'mod_spatialite.so'
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.spatialite',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
[...]
models.py
from django.db import models
from django.contrib.gis.db import models as geo_models
class MyModel(models.Model):
name = models.CharField(max_length=200, null=True, blank=True)
location = geo_models.PointField(null=True)
serializers.py
from rest_framework import serializers
from drf_extra_fields.geo_fields import PointField
class MySerializer(serializers.HyperlinkedModelSerializer):
location = PointField()
views.py
from rest_framework import viewsets
from django.contrib.gis.geos import Point
from django.contrib.gis.measure import Distance
class MyViewSet(viewsets.ModelViewSet):
serializer_class = serializers.MySerializer
def get_queryset(self):
queryset = models.MyModel.objects.all().order_by('name')
latitude = self.request.query_params.get('latitude', None)
longitude = self.request.query_params.get('longitude', None)
if latitude and longitude:
point = Point(float(longitude), float(latitude))
queryset = queryset.filter(location__distance_lt=(point, Distance(km=10)))
return queryset