Python 在使用Django JSON序列化程序序列化DatetimeField时,是否可以指定datetime格式

Python 在使用Django JSON序列化程序序列化DatetimeField时,是否可以指定datetime格式,python,json,django,datetime,serialization,Python,Json,Django,Datetime,Serialization,似乎它总是将datetime字段序列化为iso格式。 我的Django版本是1.6.5。我期望的格式类似于“2014-08-08 16:00:00”。但是,无论我如何更改设置中的日期时间格式,输出总是像“2014-08-08T16:00:00”。该设置似乎无法控制序列化的格式。 我有办法更改格式吗?而不是: datetime.datetime.now().isoformat() 您必须使用: datetime.datetime.now().isoformat(' ') 详情如下: 编辑 当您

似乎它总是将datetime字段序列化为iso格式。 我的Django版本是1.6.5。我期望的格式类似于“2014-08-08 16:00:00”。但是,无论我如何更改设置中的日期时间格式,输出总是像“2014-08-08T16:00:00”。该设置似乎无法控制序列化的格式。 我有办法更改格式吗?

而不是:

datetime.datetime.now().isoformat()
您必须使用:

datetime.datetime.now().isoformat(' ')
详情如下:

编辑 当您使用
djangojsonecoder
序列化查询字符串时,它在
isoformat()
中解析
datetime
,因此您需要覆盖它

import datetime
from django.core.serializers.json import DjangoJSONEncoder
import decimal
from django.utils.timezone import is_aware

class DjangoOverRideJSONEncoder(DjangoJSONEncoder):
    """
    JSONEncoder subclass that knows how to encode date/time and decimal types.
    """
    def default(self, o):
        # See "Date Time String Format" in the ECMA-262 specification.
        if isinstance(o, datetime.datetime):
            r = o.isoformat(' ')
            if o.microsecond:
                r = r[:23] + r[26:]
            if r.endswith('+00:00'):
                r = r[:-6] + 'Z'
            return r
        elif isinstance(o, datetime.date):
            return o.isoformat(' ')
        elif isinstance(o, datetime.time):
            if is_aware(o):
                raise ValueError("JSON can't represent timezone-aware times.")
            r = o.isoformat(' ')
            if o.microsecond:
                r = r[:12]
            return r
        elif isinstance(o, decimal.Decimal):
            return str(o)
        else:
            return super(DjangoOverRideJSONEncoder, self).default(o)
现在您需要这样使用:

>>data= json.dumps(list(Model.objects.all()), cls=DjangoOverRideJSONEncoder)
>>print data
 '[{"last_updated": "2014-07-09 15:26:06",  "date_created": "2014-07-09 15:26:06","id": 11}, {"last_updated": "2014-08-25 10:48:31.946", "date_created": "2014-08-25 10:47:59.656", "id": 49093}]'
而不是:

datetime.datetime.now().isoformat()
您必须使用:

datetime.datetime.now().isoformat(' ')
详情如下:

编辑 当您使用
djangojsonecoder
序列化查询字符串时,它在
isoformat()
中解析
datetime
,因此您需要覆盖它

import datetime
from django.core.serializers.json import DjangoJSONEncoder
import decimal
from django.utils.timezone import is_aware

class DjangoOverRideJSONEncoder(DjangoJSONEncoder):
    """
    JSONEncoder subclass that knows how to encode date/time and decimal types.
    """
    def default(self, o):
        # See "Date Time String Format" in the ECMA-262 specification.
        if isinstance(o, datetime.datetime):
            r = o.isoformat(' ')
            if o.microsecond:
                r = r[:23] + r[26:]
            if r.endswith('+00:00'):
                r = r[:-6] + 'Z'
            return r
        elif isinstance(o, datetime.date):
            return o.isoformat(' ')
        elif isinstance(o, datetime.time):
            if is_aware(o):
                raise ValueError("JSON can't represent timezone-aware times.")
            r = o.isoformat(' ')
            if o.microsecond:
                r = r[:12]
            return r
        elif isinstance(o, decimal.Decimal):
            return str(o)
        else:
            return super(DjangoOverRideJSONEncoder, self).default(o)
现在您需要这样使用:

>>data= json.dumps(list(Model.objects.all()), cls=DjangoOverRideJSONEncoder)
>>print data
 '[{"last_updated": "2014-07-09 15:26:06",  "date_created": "2014-07-09 15:26:06","id": 11}, {"last_updated": "2014-08-25 10:48:31.946", "date_created": "2014-08-25 10:47:59.656", "id": 49093}]'