【问题标题】:How to override GeoDjango GeoJSON Seriliazer to include model properties如何覆盖 GeoDjango GeoJSON Seriliazer 以包含模型属性
【发布时间】:2018-07-24 22:45:33
【问题描述】:

这是泛型的一个分支,我如何在 JSON 序列化中包含属性,在此回答: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做同样的事情?

【问题讨论】:

    标签: django geojson geodjango django-serializer


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 2012-02-12
      • 2014-10-06
      • 1970-01-01
      相关资源
      最近更新 更多