6

我嘗試使用DRF序列化器來序列化模型對象。我發現對象中的DatetimeField將不會輸出ISO-8601格式的"2015-10-21T09:28:53.769000Z"設置django rest框架配置的DatetimeField格式

我查找DRF文件爲什麼我不能輸出ISO-8601格式。根據datetimefield說:

format - 表示輸出格式的字符串。如果未指定,則默認爲與DATETIME_FORMAT設置鍵相同的值,除非設置,否則它將爲'iso-8601'。設置爲格式字符串表示to_representation返回值應強制爲字符串輸出。格式字符串如下所述。這個值設置爲None表示Python的

這意味着它的默認輸出iso-8601格式,如果我從來沒有DATETIME_FORMAT說法?還沒有,它仍然沒有改變。

當我嘗試寫Django項目的設置如下所示:

REST_FRAMEWORK = { 
    'DATETIME_FORMAT': "iso-8601", 
} 

或我DateTimeField字段參數寫成如下:

class UserSerializer(...): 
    last_login = DatetimeField(format='iso-8601') 
    class Meta: 
     model = User 
     fields = ('email', 'displayname', 'is_active', 
        'date_joined', 'last_login') 

這一次仍然沒有改變。

任何人都知道如何設置它?

+1

'DateTimeField字段中對象不會輸出ISO-8601格式的「...」是什麼輸出的? –

+0

我面臨同樣的問題!如果我使用此字段的validated_data,它將輸出類似「2018-01-12 10:20:55」(可能是日期時間對象的默認表示形式?)。我對文檔的理解是輸出結果應該是「2018-01-12T10:20:55 + 00:00」。我在validated_data上調用isoformat()以獲得現在適當的格式,但我一定錯過了一些東西...... – Laurent

回答

12

如果你不知道你發生什麼,你還是不解決售後服務,我可以設置爲以下定義datettime格式:

REST_FRAMEWORK = { 
    'DATETIME_FORMAT': "%Y-%m-%dT%H:%M:%S.%fZ", 
} 
1

您不需要在設置中定義DATETIME_FORMATformatlast_login字段中,因爲iso-861是默認格式。

下面是一個示例示例,顯示iso-861格式的日期時間字段的序列化輸出。

In [1]: from rest_framework import serializers 

In [2]: from datetime import datetime 

In [3]: class SomeSerializer(serializers.Serializer): 
    ....:  last_login = serializers.DateTimeField() 
    ....:  

In [4]: x = SomeSerializer(data={'last_login':datetime.now()}) 

In [5]: x.is_valid() 
Out[5]: True 

In [6]: x.data # representation of 'last_login' will be in iso-8601 formatted string 
Out[6]: OrderedDict([('last_login', u'2015-10-22T09:32:02.788611Z')])