代码之家  ›  专栏  ›  技术社区  ›  Patrick

如何重写GeoDjango GeoJSON serializer以包含模型属性

  •  0
  • Patrick  · 技术社区  · 6 年前

    这是通用how can I include properties in a JSON serialization的一个分支,这里给出了答案: https://stackoverflow.com/a/38253327/4140357

    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 ?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Patrick    6 年前

    将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' ...]
    )