将地理空间数据加载到 postgresql + postgis 数据库后,目标是将其以 geojson 格式返回到视图中。
模型.py
class Group(models.Model):
name = models.CharField(max_length=60)
class Country(models.Model):
name = models.CharField(max_length=60)
groups = models.ManyToManyField(Group, related_name='groups')
views.py
def countries(request):
queryset = Country.objects.annotate(json=AsGeoJSON('mpoly'))
data = serializers.serialize(
'geojson',
queryset,
geometry_field='mpoly',
fields=('name', 'groups')
)
return HttpResponse(data)
输出的 geojson 不包含每个国家/地区的嵌套 groups。如何将它们添加到功能/属性字段中?
ArrayAgg
[Django-doc]:来做到这一点
from django.contrib.postgres.aggregates import ArrayAgg
def countries(request):
queryset = Country.objects.annotate(
json=AsGeoJSON('mpoly'), group_names=ArrayAgg('groups__name')
)
data = serializers.serialize(
'geojson',
queryset,
geometry_field='mpoly',
fields=('name', 'group_names'),
)
return HttpResponse(data)
但是从序列化变得更加复杂的那一刻起,您可能最好使用 Django REST 框架 [drf-doc],它提供了更复杂的序列化。