代码之家  ›  专栏  ›  技术社区  ›  Jason Christa

如何在Django中序列化模型实例?

  •  124
  • Jason Christa  · 技术社区  · 15 年前

    有很多关于如何序列化模型查询集的文档,但是如何只序列化模型实例的字段到JSON?

    13 回复  |  直到 6 年前
        1
  •  201
  •   Michael Jackson Aaron M.    12 年前

    您可以轻松地使用一个列表来包装所需的对象,这就是Django序列化程序正确序列化它所需的全部内容,例如:

    from django.core import serializers
    
    # assuming obj is a model instance
    serialized_obj = serializers.serialize('json', [ obj, ])
    
        2
  •  40
  •   Tim Saylor    9 年前

    要避免使用数组包装器,请在返回响应之前将其移除:

    import json
    from django.core import serializers
    
    def getObject(request, id):
        obj = MyModel.objects.get(pk=id)
        data = serializers.serialize('json', [obj,])
        struct = json.loads(data)
        data = json.dumps(struct[0])
        return HttpResponse(data, mimetype='application/json')
    

    我也发现了这篇关于这个主题的有趣文章:

    http://timsaylor.com/convert-django-model-instances-to-dictionaries

    它使用了django.forms.models.model_to_dict,这看起来是工作的完美工具。

        3
  •  40
  •   Pavel Daynyak    8 年前

    如果你正在处理一个模型实例列表,你能做的最好的就是使用 serializers.serialize() 它完全符合你的需要。

    但是,您将面临一个问题,尝试序列化 单一的 对象,而不是 list 物体的这样,为了摆脱不同的黑客,只需使用django的 model_to_dict (如果我没有弄错, 序列化程序。序列化() 也依赖于它):

    from django.forms.models import model_to_dict
    
    # assuming obj is your model instance
    dict_obj = model_to_dict( obj )
    

    你现在只需要一个 json.dumps 调用将其序列化到JSON:

    import json
    serialized = json.dumps(dict_obj)
    

    就是这样!:)

        4
  •  9
  •   David Berger    15 年前

    听起来,您所要求的是序列化django模型实例的数据结构以实现互操作性。其他的海报是正确的:如果您希望将序列化的表单与可以通过Django的API查询数据库的Python应用程序一起使用,那么您将希望用一个对象序列化一个查询集。另一方面,如果您需要的是在不接触数据库或不使用django的情况下在其他地方重新充气模型实例,那么您需要做一些工作。

    我要做的是:

    首先,我使用 demjson 用于转换。这恰好是我最先发现的,但可能不是最好的。我的实现依赖于它的一个特性,但是对于其他转换器应该有类似的方法。

    第二,实现 json_equivalent 方法对可能需要序列化的所有模型。这是一个神奇的方法 德姆森 但是,无论您选择什么实现,它都可能是您想要考虑的事情。其思想是返回一个可直接转换为 json (即数组或字典)。如果您真的想自动执行此操作:

    def json_equivalent(self):
        dictionary = {}
        for field in self._meta.get_all_field_names()
            dictionary[field] = self.__getattribute__(field)
        return dictionary
    

    这对您没有帮助,除非您有一个完全扁平的数据结构(否 ForeignKeys ,仅限于数据库中的数字和字符串等)。否则,您应该认真考虑实现此方法的正确方法。

    第三,呼叫 demjson.JSON.encode(instance) 你拥有你想要的。

        5
  •  8
  •   benlast    11 年前

    如果您询问如何从模型序列化单个对象, 知道 您只会在查询集中获得一个对象(例如,使用objects.get),然后使用如下内容:

    import django.core.serializers
    import django.http
    import models
    
    def jsonExample(request,poll_id):
        s = django.core.serializers.serialize('json',[models.Poll.objects.get(id=poll_id)])
        # s is a string with [] around it, so strip them off
        o=s.strip("[]")
        return django.http.HttpResponse(o, mimetype="application/json")
    

    这会给你带来某种形式的东西:

    {"pk": 1, "model": "polls.poll", "fields": {"pub_date": "2013-06-27T02:29:38.284Z", "question": "What's up?"}}
    
        6
  •  4
  •   davidchambers    14 年前

    我通过在模型中添加序列化方法解决了这个问题:

    def toJSON(self):
        import simplejson
        return simplejson.dumps(dict([(attr, getattr(self, attr)) for attr in [f.name for f in self._meta.fields]]))
    

    下面是那些不喜欢一句话的人的详细等价物:

    def toJSON(self):
        fields = []
        for field in self._meta.fields:
            fields.append(field.name)
    
        d = {}
        for attr in fields:
            d[attr] = getattr(self, attr)
    
        import simplejson
        return simplejson.dumps(d)
    

    _meta.fields 是可以从实例和模型本身访问的模型字段的有序列表。

        7
  •  4
  •   DanH    11 年前

    这是我的解决方案,它允许您轻松定制JSON并组织相关记录。

    首先在模型上实现一种方法。我叫 json 但你可以随意称呼它,例如:

    class Car(Model):
        ...
        def json(self):
            return {
                'manufacturer': self.manufacturer.name,
                'model': self.model,
                'colors': [color.json for color in self.colors.all()],
            }
    

    然后在我看来:

    data = [car.json for car in Car.objects.all()]
    return HttpResponse(json.dumps(data), content_type='application/json; charset=UTF-8', status=status)
    
        8
  •  4
  •   niran    8 年前

    使用列表,可以解决问题

    步骤1:

     result=YOUR_MODELE_NAME.objects.values('PROP1','PROP2').all();
    

    第二步:

     result=list(result)  #after getting data from model convert result to list
    

    步骤3:

     return HttpResponse(json.dumps(result), content_type = "application/json")
    
        9
  •  4
  •   Devan kagronick    6 年前

    有一个很好的答案,我很惊讶没有提到。只需几行,您就可以处理日期、模型和其他一切。

    制作可处理模型的自定义编码器:

    from django.forms import model_to_dict
    from django.core.serializers.json import DjangoJSONEncoder
    from django.db.models import Model
    
    class ExtendedEncoder(DjangoJSONEncoder):
    
        def default(self, o):
    
            if isinstance(o, Model):
                return model_to_dict(o)
    
            return super().default(o)
    

    现在使用json.dumps时使用它

    json.dumps(data, cls=ExtendedEncoder)
    

    现在,模型、日期和所有内容都可以序列化,而不必在数组中,也不必序列化和不序列化。

        10
  •  2
  •   Jimmy    15 年前
    ville = UneVille.objects.get(nom='lihlihlihlih')
    ....
    blablablab
    .......
    
    return HttpResponse(simplejson.dumps(ville.__dict__))
    

    我将实例的dict返回

    所以它返回类似于'field1':值,“field2”:值,……

        11
  •  2
  •   Reorx    13 年前

    这样怎么样:

    def ins2dic(obj):
        SubDic = obj.__dict__
        del SubDic['id']
        del SubDic['_state']
    return SubDic
    

    或者排除任何你不想要的。

        12
  •  1
  •   Jack M.    15 年前

    似乎你不能序列化一个实例,你必须序列化一个对象的查询集。

    from django.core import serializers
    from models import *
    
    def getUser(request):
        return HttpResponse(json(Users.objects.filter(id=88)))
    

    我用完了 svn Django的发行版,所以这可能不是早期版本。

        13
  •  1
  •   Zags    9 年前

    要序列化和反序列化,请使用以下命令:

    from django.core import serializers
    
    serial = serializers.serialize("json", [obj])
    ...
    # .next() pulls the first object out of the generator
    # .object retrieves django object the object from the DeserializedObject
    obj = serializers.deserialize("json", serial).next().object