6

我尝试通过以下方式对对象进行序列化QuerySetDict对象化:datetime.date

方式#1:

json.dumps(MyModel.objects.values())

引发错误:

异常值:[{'date': datetime.date(2012, 5, 26), 'time': datetime.time(0, 42, 27)}] 不是 JSON 可序列化的

方式#2:

json.dumps(MyModel.objects.values(), cls=DjangoJSONEncoder)

还会引发错误:

异常值:[{'date': datetime.date(2012, 5, 26), 'time': datetime.time(0, 42, 27)}] 不是 JSON 可序列化的

方式#3:

json.dumps(MyModel.objects.all(), cls=DjangoJSONEncoder)

异常值:[<MyModel:MyModel object>] 不是 JSON 可序列化的

方式#4:

serializers.serialize('json', MyModel.objects.all())

引发错误:

异常值:“str”对象没有属性“_meta”

如何在Django中将带有日期时间字段的对象序列化为JSON?

4

3 回答 3

14

您的问题与日期时间无关。只是查询集本身不能直接序列化,即使使用 DjangoJSONEncoder 类,甚至使用values(). 对于完全没有日期时间字段的模型,您将获得完全相同的结果。

您应该在 Django 中进行序列化的方式是使用serializers

from django.core import serializers
output = serializers.serialize('json', MyModel.objects.all())

但毫无疑问,您正试图避免这种情况,因为输出格式过于复杂。相反,我通常使用“python”序列化程序转换为 dict,然后转储到 json:

temp_output = serializers.serialize('python', MyModel.objects.all())
output = json.dumps(temp_output, cls=DjangoJSONEncoder)
于 2012-05-26T09:17:20.413 回答
6

如果您只想将字典转储到 JSON,只需使用 json.dumps。通过传入一个自定义序列化类可以轻松地序列化对象 - Django 中包含一个已经处理日期时间的类:

from django.core.serializers.json import DjangoJSONEncoder
json.dumps(mydict, cls=DjangoJSONEncoder)
于 2013-12-01T08:23:04.480 回答
0

这是我以 json 格式检索日期时间的方式,

from django.core import serializers
_data = serializers.serialize('json', MyModel.objects.all())
bi_data = [i.get('fields', i) for i in json.loads(_data) if i]
于 2018-06-07T09:26:15.460 回答