Django单个对象的序列化器

27 投票
3 回答
27754 浏览
提问于 2025-04-15 20:04

我正在尝试找到一种方法,将一些Django模型对象转换成JSON格式,类似于:

j = Job.objects.get(pk=1)
##############################################
#a way to get the JSON for that j variable???
##############################################

我不想要:

from django.core import serializers
serializers.serialize('json', Job.objects.get(pk=1),ensure_ascii=False)

因为这样返回的是一个JSON数组,而不是单个对象的表示。

有没有什么好的主意?

我想到的一种方法是:找一种方式获取对象的属性和对应值的哈希,然后用simplejson来获取它的JSON表示,不过我不知道怎么获取这个哈希。

3 个回答

15

我建议你使用Django的 model_to_dict。如果我没记错的话,serializers.serialize() 也是依赖这个方法的,不过它只适用于 list,而不适合单个模型实例。这样你就可以从一个单独的模型中获取一个包含模型字段的 dict 实例:

from django.forms.models import model_to_dict

# assuming obj is your model instance
dict_obj = model_to_dict( obj )

现在你只需要简单地调用一次 json.dumps

import json
json.dumps(dict_obj)
21

方法一

使用 Django 的序列化工具,并选择 python 格式

from django.core import serializers

j = Job.objects.get(pk=1)
response = serializers.serialize('python', [j], ensure_ascii=False)

方法二

在序列化时使用 json 格式,并对字符串响应进行 loads 操作

import json
from django.core import serializers

j = Job.objects.get(pk=1)
json_str_response = serializers.serialize('json', [j], ensure_ascii=False)
response = json.loads(json_str_response)[0]

方法三

使用 Django REST Framework 的序列化类,定义一个序列化类,然后对实例进行序列化

from rest_framework import serializers


class JobSerializer(serializers.ModelSerializer):
    class Meta:
        model = Job
        fields = '__all__'


j = Job.objects.get(pk=1)
response = JobSerializer(instance=j).data

参考资料
1. 序列化 Django 模型对象

34

你可以对从 serializers.serialize 得到的结果稍微处理一下。其实,把结果前后的方括号去掉并不难。

job = Job.objects.get(pk=1)
array_result = serializers.serialize('json', [job], ensure_ascii=False)
just_object_result = array_result[1:-1]

这个方法虽然简单,但它能让你得到的结果只是一个 JSON 格式的对象。

撰写回答