如何覆盖 GeoDjango GeoJSON Seriliazer 以包含模型属性

How to override GeoDjango GeoJSON Seriliazer to include model properties

这是通用如何在 JSON 序列化中包含属性的分支,在这里回答:

from django.core.serializers.base import Serializer as BaseSerializer
from django.core.serializers.python import Serializer as PythonSerializer
from django.core.serializers.json import Serializer as JsonSerializer

class ExtBaseSerializer(BaseSerializer):

    def serialize_property(self, obj):
        model = type(obj)
        for field in self.selected_fields:
            if hasattr(model, field) and type(getattr(model,
                field)) == property:
                    self.handle_prop(obj, field)

    def handle_prop(self, obj, field):
        self._current[field] = getattr(obj, field)

    def end_object(self, obj):
        self.serialize_property(obj)

        super(ExtBaseSerializer, self).end_object(obj)


class ExtPythonSerializer(ExtBaseSerializer, PythonSerializer):
    pass


class ExtJsonSerializer(ExtPythonSerializer, JsonSerializer):
    pass

使用方法:

ExtJsonSerializer().serialize(
    MyModel.objects.all(),
    fields=['field_name_1', 'property_1' ...]
)

它非常适合 JSON。

你怎么能为 GEODJango's GEJSON serializer 做同样的事情?

更改 JSON 的原始答案以使用 GEOJSON 非常简单。

您需要更改导入中的一行,而不是导入 from django.core.serializers.json import Serializer as JsonSerializer 你导入 GEOJSON 一个 from django.contrib.gis.serializers.geojson import Serializer as JsonSerializer

这是便于剪切和粘贴的完整代码。

from django.core.serializers.base import Serializer as BaseSerializer
from django.core.serializers.python import Serializer as PythonSerializer
from django.contrib.gis.serializers.geojson import Serializer as JsonSerializer


class ExtBaseSerializer(BaseSerializer):

    def serialize_property(self, obj):
        model = type(obj)
        for field in self.selected_fields:
            if hasattr(model, field) and type(getattr(model,
                field)) == property:
                    self.handle_prop(obj, field)

    def handle_prop(self, obj, field):
        self._current[field] = getattr(obj, field)

    def end_object(self, obj):
        self.serialize_property(obj)

        super(ExtBaseSerializer, self).end_object(obj)


class ExtPythonSerializer(ExtBaseSerializer, PythonSerializer):
    pass


class ExtJsonSerializer(ExtPythonSerializer, JsonSerializer):
    pass

使用方法:

ExtJsonSerializer().serialize(
    MyModel.objects.all(),
    fields=['field_name_1', 'property_1' ...]
)