Как добавить поле 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], который обеспечивает более сложную и запутанную сериализацию.

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