有很多关于如何序列化模型QuerySet的文档,但是如何将模型实例的字段序列化为JSON呢?
当前回答
所有这些答案与我对框架的期望相比都有点俗气,我认为到目前为止,如果你使用的是rest框架,最简单的方法是:
rep = YourSerializerClass().to_representation(your_instance)
json.dumps(rep)
这将直接使用Serializer,尊重您在其上定义的字段,以及任何关联等等。
其他回答
为了避免数组包装器,在返回响应之前删除它:
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,它看起来是完成这项工作的完美工具。
这样怎么样:
def ins2dic(obj):
SubDic = obj.__dict__
del SubDic['id']
del SubDic['_state']
return SubDic
或者排除你不想要的东西。
所有这些答案与我对框架的期望相比都有点俗气,我认为到目前为止,如果你使用的是rest框架,最简单的方法是:
rep = YourSerializerClass().to_representation(your_instance)
json.dumps(rep)
这将直接使用Serializer,尊重您在其上定义的字段,以及任何关联等等。
你可以很容易地使用一个列表来包装所需的对象,这就是django序列化器正确序列化它所需要的,例如:
from django.core import serializers
# assuming obj is a model instance
serialized_obj = serializers.serialize('json', [ obj, ])
如果你正在询问如何序列化一个模型中的单个对象,并且你知道你只会在queryset中获得一个对象(例如,使用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?"}}
推荐文章
- 如何选择一个记录和更新它,与一个单一的查询集在Django?
- Django REST框架:向ModelSerializer添加额外字段
- 如何在django上自动化createsuperuser ?
- 如何将Django QuerySet转换为列表?
- 如何直接从测试驱动程序调用自定义的Django manage.py命令?
- 在Python Django中运行单元测试时,如何禁用日志记录?
- Django CSRF检查Ajax POST请求失败
- 如何重命名一个模型字段使用南方?
- Django修复Admin复数
- 如何在Django上列出urlpatterns(端点)?
- Django自引用外键
- Django:“projects”vs“apps”
- 我如何在Django中过滤一个DateTimeField的日期?
- 如何在Django中序列化一个模型实例?
- Django更改默认的runserver端口