Django在QuerySet / Dict中将datetime序列化为json

时间:2012-05-26 08:52:59

标签: django serialization django-models json

我尝试通过以下方式将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对象>]不是JSON可序列化的

方式#4:

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

引发错误:

  

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

如何在Django中使用datetime的字段将对象序列化为JSON?

3 个答案:

答案 0 :(得分:12)

您的问题与日期时间无关。简单地说,查询集本身不能直接序列化,即使使用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)

答案 1 :(得分:4)

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

from django.core.serializers.json import DjangoJSONEncoder
json.dumps(mydict, cls=DjangoJSONEncoder)

答案 2 :(得分: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]