Как добавить поле ManyToMany в сериализатор geojson
После загрузки геопространственных данных в базу данных postgresql + postgis необходимо вернуть их в представлении в формате geojson.
models.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 нет вложенных групп для каждой страны. Как добавить их в поле характеристик / свойств?
Вы можете сделать это, агрегируя с 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 framework [drf-doc], который обеспечивает более сложную и запутанную сериализацию.