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

关于如何序列化模型QuerySet有很多文档,但是如何将模型实例的字段序列化为JSON呢?

你可以很容易地使用列表来包装所需的对象,这就是django序列化器需要正确序列化的所有东西,例如:

 from django.core import serializers # assuming obj is a model instance serialized_obj = serializers.serialize('json', [ obj, ]) 

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

 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') 

我在这个主题上也发现了这个有趣的post:

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

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

如果你正在处理一个模型实例列表,你可以做的最好的事情就是使用serializers.serialize() ,它将完美地满足你的需求。

然而,你将面临一个问题,试图序列化一个单一的对象,而不是一个对象list 。 这样,为了摆脱不同的黑客,只需使用Django的model_to_dict (如果我没有错, serializers.serialize()依赖于它):

 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) 

而已! 🙂

这听起来像你在问什么涉及序列化Django模型实例的数据结构的互操作性。 其他的海报是正确的:如果你想要序列化的forms与可以通过Django的api查询数据库的python应用程序一起使用,那么你会想要序列化一个对象的查询集。 另一方面,如果您需要的是在别处触摸数据库或不使用Django的情况下将模型实例重新充气的方法,那么您有一点工作要做。

这就是我所做的:

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

其次,在所有需要序列化的模型上实现一个json_equivalent方法。 这是demjson一个神奇的方法,但是无论你select什么实现,这可能是你想要考虑的事情。 这个想法是,你返回一个可以直接转换成json的对象(即数组或字典)。 如果你真的想自动做到这一点:

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

这不会对你有帮助,除非你有一个完全平坦的数据结构(没有ForeignKeys ,只有数据库中的数字和string等)。 否则,你应该认真考虑实施这种方法的正确方法。

第三,调用demjson.JSON.encode(instance) ,你有你想要的。

如果你问如何序列化一个模型中的单个对象,并且你知道你只会在查询集中获得一个对象(例如,使用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") 

这会给你一些forms的东西:

 {"pk": 1, "model": "polls.poll", "fields": {"pub_date": "2013-06-27T02:29:38.284Z", "question": "What's up?"}} 

我通过向我的模型添加序列化方法来解决此问题:

 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是可以从实例和模型本身访问的模型字段的有序列表。

使用列表,它将解决问题

步骤1:

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

第2步:

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

第三步:

  return HttpResponse(json.dumps(result), content_type = "application/json") 
 ville = UneVille.objects.get(nom='lihlihlihlih') .... blablablab ....... return HttpResponse(simplejson.dumps(ville.__dict__)) 

我返回我的实例的字典

所以它返回类似{'field1':value,“field2”:value,….}

这样如何:

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

或排除任何你不想要的东西。

这是我的解决scheme,它允许您轻松地自定义JSON以及组织相关的logging

首先在模型上实现一个方法。 我打电话是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) 

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

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

我用完了django的svn版本,所以这可能不在早期版本中。

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

 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