У меня есть две модели: одна для сохранения сетки точек, а вторая для сохранения геопространственных данных
from django.contrib.gis.db import models as geomodels
from django.db import models
class Grid(geomodels.Model):
geom = geomodels.PointField(srid=4326, unique=True)
elevation = geomodels.FloatField(blank=True, null=True)
class SpData(models.Model):
mtime = models.DateTimeField()
grid = models.ForeignKey(Grid)
measure = models.DecimalField(
max_digits=6,
decimal_places=1,
blank=True,
null=True,
)
С помощью фреймворка django очень легко получить файл геоджон для модели с геометриейполе в качестве моей модели Grid, и следующий вид предоставляет хороший геоджон с геом в качестве поля геометрии и «возвышением» в свойствах.
from django.http import HttpResponse
from django.core.serializers import serialize
from rest_framework.views import APIView
from .models import Grid
class GridView(APIView):
def get(self, request):
result = serialize(
"geojson",
Grid.objects.all(),
geometry_field="geom",
srid=4326,
fields=(
"elevation",
),
)
return HttpResponse(result)
Теперь я хочу использовать ту же сетку для отображения записей SpData, которыепривязан к моей модели Grid для отображения значения 'measure', но мне не удается указать сериализатору, что я хочу использовать геометрию таблицы Grid.Я думал, что такой элегантный код может работать:
class SpDataView(APIView):
def get(self, request):
geodata = SpData.objects.filter(mtime=today())
fields = ("measure", "grid",)
result = serialize(
"geojson",
geodata,
geometry_field="grid.geom",
srid=4326,
fields=fields,
use_natural_foreign_keys=True,
)
return HttpResponse(result)
Но это не так.Итак, я попытался добавить поле свойства в свою модель SpData, но оно тоже не работает:
class SpData(models.Model):
mtime = models.DateTimeField()
grid = models.ForeignKey(Grid)
measure = models.DecimalField(
max_digits=6,
decimal_places=1,
blank=True,
null=True,
)
@property
def geom(self):
return self.grid.geom
class SpDataView(APIView):
def get(self, request):
geodata = SpData.objects.filter(mtime=today())
fields = ("measure", "geom",)
result = serialize(
"geojson",
geodata,
geometry_field="geom",
srid=4326,
fields=fields,
)
return HttpResponse(result)
Я пытался использовать необработанный SQL-запрос, но сериализатор рассматривает только поля моделина котором был сделан необработанный sql.
strsql ='SELECT sp.pk, sp.measure, g.geom '
strsql += ' FROM SpData AS sp'
strsql += ' INNER JOIN Grid AS g'
strsql += ' ON sp.grid = g.pk'
strsql += ' WHERE sp.mtime = today()'
geodata = SpData.objects.raw(strsql)
fields = ("measure", "geom",)
result = serialize(
"geojson",
geodata,
geometry_field="geom",
srid=4326,
fields=fields,
)
return HttpResponse(result)
Но геометрия в моем полученном геойсоне равна нулю.Таким образом, обращение к SQL предоставит геометрию, но не добавит поле 'measure' в свойства:
strsql ='SELECT g.pk, sp.measure, g.geom '
strsql += ' FROM Grid AS g'
strsql += ' INNER JOIN SpData AS sp'
strsql += ' ON sp.grid = g.pk'
strsql += ' WHERE sp.mtime = today()'
geodata = Grid.objects.raw(strsql)
Чего мне не хватает?Это выходит за рамки текущего сериализатора geodjango?