你如何在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