【问题标题】:Override Django Object Serializer to get rid of specified model覆盖 Django Object Serializer 以摆脱指定的模型
【发布时间】:2011-07-24 02:51:57
【问题描述】:

我需要将 Django Queryset 对象转换为 Json 字符串。内置的 Django 序列化库效果很好。尽管它指定了创建它的模型的名称。既然我不需要这个,我该如何摆脱它?我还需要覆盖什么才能使用下面覆盖的 end_object 方法?

class Serializer(PythonSerializer):
    def end_object(self, obj):
        self.objects.append({
            "model"  : smart_unicode(obj._meta), # <-- I want to remove this
            "pk"     : smart_unicode(obj._get_pk_val(), strings_only=True),
            "fields" : fields
        })  
        self._current = None

【问题讨论】:

  • 不敢相信这不是内置的。为什么我想要所有不必要的元数据。呃。

标签: django serialization object overriding


【解决方案1】:

对不起,我完全忘记了这个问题。这就是我最终解决它的方式(感谢#django 上的 FunkyBob):

from django.core.serializers.python import Serializer

class MySerialiser(Serializer):
    def end_object( self, obj ):
        self._current['id'] = obj._get_pk_val()
        self.objects.append( self._current )

 # views.py
 serializer = MySerialiser()
 data = serializer.serialize(some_qs)

【讨论】:

    【解决方案2】:

    这是一个序列化程序,它从序列化输出中删除所有元数据(pk、模型),并将字段向上移动到每个对象的顶层。在 django 1.5 中测试

    from django.core.serializers import json
    
    
    class CleanSerializer(json.Serializer):
    
        def get_dump_object(self, obj):
            return self._current
    
    
    Serializer = CleanSerializer
    

    编辑:

    在将我的应用程序迁移到旧版本的 django 时(由于托管服务提供商的变化),上述序列化程序停止工作。下面是处理引用版本的序列化程序:

    import logging
    import django
    
    from django.core.serializers import json
    from django.utils.encoding import smart_unicode
    
    
    class CleanSerializer148(json.Serializer):
    
        def end_object(self, obj):
            current = self._current
            current.update({'pk': smart_unicode(obj._get_pk_val(),
                                                strings_only=True)})
            self.objects.append(current)
            self._current = None
    
    
    class CleanSerializer151(json.Serializer):
    
        def get_dump_object(self, obj):
            self._current['pk'] = obj.pk
            return self._current
    
    
    if django.get_version() == '1.4.8':
        CleanSerializer = CleanSerializer148
    
    else:
        CleanSerializer = CleanSerializer151
    
    
    Serializer = CleanSerializer
    

    【讨论】:

      【解决方案3】:

      重写 JSON 序列化程序类:

      from django.core.serializers.json import Serializer, DjangoJSONEncoder
      from django.utils import simplejson
      
      class MySerializer(Serializer):
      """
      Convert QuerySets to JSONS, overrided to remove "model" from JSON
      """
      
      def end_serialization(self):
      
          # little hack
          cleaned_objects = []
      
          for obj in self.objects:
              del obj['model'] 
              cleaned_objects.append(obj)
      
          simplejson.dump(cleaned_objects, self.stream, cls=DjangoJSONEncoder, **self.options)
      

      在视图中:

          JSONSerializer = MySerializer
          jS = JSONSerializer()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-18
        • 1970-01-01
        • 2015-11-27
        • 2019-11-28
        • 1970-01-01
        • 1970-01-01
        • 2013-01-16
        • 1970-01-01
        相关资源
        最近更新 更多