Django 将日期时间序列化为 QuerySet/Dict 中的 json

Posted

技术标签:

【中文标题】Django 将日期时间序列化为 QuerySet/Dict 中的 json【英文标题】:Django serialize datetime to json in QuerySet/Dict 【发布时间】:2012-06-01 15:44:04 【问题描述】:

我尝试通过以下方式将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)

异常值:[] 不是 JSON 可序列化的

方式#4:

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

引发错误:

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

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

【问题讨论】:

json.dumps(value, cls=DjangoJSONEncoder) 正在为我工​​作,value 从您在#2 中遇到的异常中复制。您能否提供更多信息,Python 和 Django 版本可能相关? (我用 Python 2.7.1 和 Django 1.3.1 对此进行了测试) @georgebrock 抱歉,这种方法确实有效。我的代码中还有一个错误。 【参考方案1】:

这是我以 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]

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

谢谢,它的作品。但是serializers.serializefields: ..., model: "...", pk: "..." 形式返回结果。有办法只返回字段,例如:field1: "...", field2: "...", ...? 将字段作为参数添加到 serializers.serialize() 函数。 json_serialized_objects = serializers.serialize("json", query_agao, fields=("fieldname1", "fieldname2"))。更多信息,请参阅http://***.com/a/25564526/3001007

以上是关于Django 将日期时间序列化为 QuerySet/Dict 中的 json的主要内容,如果未能解决你的问题,请参考以下文章

Django 将日期解析为 QuerySet 中的 dd-mm-yyyy

按日期时间的月/日订购 Django QuerySet?

Django QuerySet 是不是使用二进制搜索按日期过滤?

Django:按日期过滤日期时间忽略时间

django model 条件过滤 queryset.filter(**condtions) 用法

Django queryset 'in' 运算符在第一次调用时失败