有很多关于如何序列化模型QuerySet的文档,但是如何将模型实例的字段序列化为JSON呢?
当前回答
你可以很容易地使用一个列表来包装所需的对象,这就是django序列化器正确序列化它所需要的,例如:
from django.core import serializers
# assuming obj is a model instance
serialized_obj = serializers.serialize('json', [ obj, ])
其他回答
这个问题有一个很好的答案,我很惊讶它没有被提及。只需几行代码,您就可以处理日期、模型和其他所有内容。
制作一个可以处理模型的自定义编码器:
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)
现在模型,日期和所有东西都可以序列化它不需要在数组中或序列化或非序列化。任何自定义的东西都可以添加到默认方法中。
你甚至可以这样使用Django的原生JsonResponse:
from django.http import JsonResponse
JsonResponse(data, encoder=ExtendedEncoder)
如果你想将单个模型对象作为json响应返回给客户端,你可以做这个简单的解决方案:
from django.forms.models import model_to_dict
from django.http import JsonResponse
movie = Movie.objects.get(pk=1)
return JsonResponse(model_to_dict(movie))
.values()是我需要将模型实例转换为JSON。
.values()文档:https://docs.djangoproject.com/en/3.0/ref/models/querysets/#values
名为Project的模型的示例使用。
注意:我使用的是Django Rest Framework
from django.http import JsonResponse
@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",
}
为了避免数组包装器,在返回响应之前删除它:
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,它看起来是完成这项工作的完美工具。
你可以很容易地使用一个列表来包装所需的对象,这就是django序列化器正确序列化它所需要的,例如:
from django.core import serializers
# assuming obj is a model instance
serialized_obj = serializers.serialize('json', [ obj, ])
推荐文章
- 如何选择一个记录和更新它,与一个单一的查询集在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端口