Answers:
您可以轻松地使用列表来包装所需的对象,而这正是Django序列化程序正确地序列化它所需要的,例如:
from django.core import serializers
# assuming obj is a model instance
serialized_obj = serializers.serialize('json', [ obj, ])
[0]
想像@DavorLucic建议的那样在最后一行的结尾?而且,您不需要在列表文字中使用逗号结尾(因为对PEP8的热爱;)。
如果您要处理的模型实例列表是您最好的选择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)
而已!:)
datetime
字段失败。json.loads(serialize('json', [obj]))[0]
序列化器django.core.serializers.serialize
为了避免数组包装,请在返回响应之前将其删除:
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,它看起来像是完成这项工作的理想工具。
对此有一个很好的答案,我很惊讶没有提到它。仅需几行,您就可以处理日期,模型以及其他所有内容。
制作一个可以处理模型的自定义编码器:
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)
现在,模型,日期和所有内容都可以序列化,而不必放在数组中或序列化和非序列化。您拥有的所有自定义内容都可以添加到default
方法中。
您甚至可以通过以下方式使用Django的本地JsonResponse:
from django.http import JsonResponse
JsonResponse(data, encoder=ExtendedEncoder)
``
json.dumps
和json.dump
方法一起使用。这样,您无需更改应用程序的工作流程,因为您可以使用自定义对象或在转换为json之前添加另一个方法调用。只需将您的转换代码添加到编码器中,即可开始使用。
听起来您要问的是涉及序列化Django模型实例的数据结构以实现互操作性。其他张贴者是正确的:如果您希望将序列化表格与可以通过Django api查询数据库的python应用程序一起使用,则需要使用一个对象序列化一个查询集。另一方面,如果您需要的是在不接触数据库或不使用Django的情况下在其他地方重新添加模型实例的方法,则您需要做一些工作。
这是我的工作:
首先,我demjson
用于转换。碰巧是我首先发现的,但可能不是最好的。我的实现方式取决于其功能之一,但其他转换器也应采用类似的方式。
其次,json_equivalent
在可能需要序列化的所有模型上实现一个方法。这是的神奇方法demjson
,但是无论您选择哪种实现,都可能要考虑一下。这个想法是,您返回一个可以直接转换为的对象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)
您,您便拥有了想要的东西。
如果您要问如何从模型中序列化一个对象,并且知道仅要在查询集中获取一个对象(例如,使用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?"}}
我通过向模型添加序列化方法解决了这个问题:
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
是模型字段的有序列表,可以从实例和模型本身进行访问。
这是我的解决方案,可让您轻松自定义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)
car.json()
使用清单,将解决问题
第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")
要序列化和反序列化,请使用以下命令:
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 = next(serializers.deserialize("json", serial)).object
.values()
我需要将模型实例转换为JSON。
.values()文档:https ://docs.djangoproject.com/zh/3.0/ref/models/querysets/#values
名为Project的模型的示例用法。
注意:我正在使用Django Rest Framework
@csrf_exempt
@api_view(["GET"])
def get_project(request):
id = request.query_params['id']
data = Project.objects.filter(id=id).values()
if len(data) == 0:
return JsonResponse(status=404, data={'message': 'Project with id {} not found.'.format(id)})
return JsonResponse(data[0])
有效ID的结果:
{
"id": 47,
"title": "Project Name",
"description": "",
"created_at": "2020-01-21T18:13:49.693Z",
}
python
格式,from django.core import serializers
qs = SomeModel.objects.all()
serialized_obj = serializers.serialize('python', qs)
json
和python
格式有什么区别?该json
格式将返回的结果str
,而python
将在返回的结果要么list
或OrderedDict
OrderedDict
,不是dict
ville = UneVille.objects.get(nom='lihlihlihlih')
....
blablablab
.......
return HttpResponse(simplejson.dumps(ville.__dict__))
我返回我的实例的命令
因此它返回的内容类似于{'field1':value,“ field2”:value,....}
TypeError: <django.db.models.base.ModelState object at 0x7f2b3bf62310> is not JSON serializable
django.core
来执行此操作。是否有不使用序列化查询集的特定原因?