【问题标题】:Django serializer for one object一个对象的 Django 序列化程序
【发布时间】:2011-01-24 08:41:58
【问题描述】:

我正在想办法将一些 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 表示,但是我不知道如何获取哈希。

【问题讨论】:

标签: python django json


【解决方案1】:

方法一

使用 python 格式的 Django 序列化程序

from django.core import serializers

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

方法-2

在序列化和加载字符串响应时使用json格式

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]

方法-3

使用Django REST Framework's Serializer class 定义一个序列化器类并将实例序列化为

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.Serializer Django model object

【讨论】:

  • 天哪,谢谢你的方法 3。有这么多疯狂的答案,我只需要将实例设置为返回对象,然后引用它上面的数据。谢谢。
  • 遗憾的是,当我试图从视图中的 HttpResponse 中返回方法 3 的响应时,我只得到字段的名称
【解决方案2】:

我建议使用 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)

【讨论】:

  • 这显然不适用于日期时间对象。
  • json.dumps(dict_obj, cls=DjangoJSONEncoder) 将处理日期时间
  • 遗憾的是 model_to_dict() 不处理“use_natural_foreign_keys”选项。
【解决方案3】:

只是按摩你从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 表示法的对象。

【讨论】:

  • 不就是把[0]放在array_result的末尾吗? just_object_result = array_result[0]
  • 没有。 array_result 是一个序列化为 json 的数组,将是一个在开头和结尾处以[] 结尾的字符串。如果array_result = '[...]'arrary_result[1:-1] 给出'...'array_result[0] 给出'['。这个问题是关于将数据序列化为字符串的。 s[start:end] 表示法是 slice of string s
  • 这应该内置在模型中,就像 .to_json() 方法一样。
猜你喜欢
  • 1970-01-01
  • 2016-10-22
  • 2015-01-28
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
相关资源
最近更新 更多