master
ブランチに対して存在することを確認しました。ISO-8601形式での日時シリアル化の実装は、コードベースで一貫していません。
https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/fields.py#L1094では、マイクロ秒がシリアル化された値に含まれています
https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/utils/encoders.py#L30ではミリ秒のみです
一貫した実装を期待します。
該当なし
現在、私のAPIの一部のクライアントは、ミリ秒の精度の日付を必要とし、マイクロ秒を処理できません。 これは、DRF3.3の設定で「DATETIME_FORMAT」を「なし」に設定することで実現しました。 3.4にアップグレードすると、この動作が中断されます。 以前の動作を取得する簡単な方法はありますか? ECMA-262形式を提供する日時形式の文字列を指定する方法がわかりません。 ありがとう。
@georgejleeこれを
import datetime
from rest_framework.renderers import JSONRenderer
from rest_framework.utils.encoders import JSONEncoder
class MilliSecondEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
representation = obj.isoformat()
if obj.microsecond:
representation = representation[:23] + representation[26:]
if representation.endswith('+00:00'):
representation = representation[:-6] + 'Z'
return representation
else:
return super().default(obj)
class JSONRenderer(JSONRenderer):
encoder_class = MilliSecondEncoder
うーん、DEFAULT_RENDERER_CLASSESをカスタムレンダラーに変更しても、ビューセットのレンダリングには影響しませんでした。 奇妙なことに、renderer_classを明示的に設定する必要がありました。
encoder_class
に対してdatetime
encoder_class
を介してカスタムエンコーダーを使用するようにDRFを構成しようとしているときに、他の誰かがこれに遭遇した場合。 https://github.com/encode/django-rest-framework/issues/4255#issuecomment -234560555のソリューションが機能しなくなった問題は、フィールドのDateTimeField
のいずれかでない限り、DRFが組み込みのエンコーダーを使用することformat
にkwargセットをNone
を指定しない場合、またはDateTimeField
シリアライザを、あなたは設定する必要がありますREST_FRAMEWORK
の設定以下のためのDEFAULT_FORMAT: None
あなたの中にsettings.py
。 その場合にのみ、 custom encoder
が使用されます。
その理由は、カスタムRenderer
を使用してdatetime
をレンダリングする前に、シリアライザーフィールド(またはデフォルトのフィールドレンダラー)を使用してResponse
をフォーマットするためです。 したがって、datetimeフィールドはすでに文字列になっており、デフォルトのPythonタイプはエンコーダーによって処理されるため、デフォルトのJSONEncoderはカスタムエンコーダーを呼び出さないため、カスタムエンコーダーのdefault
メソッドは呼び出されません。
最も参考になるコメント
@georgejleeこれを
うーん、DEFAULT_RENDERER_CLASSESをカスタムレンダラーに変更しても、ビューセットのレンダリングには影響しませんでした。 奇妙なことに、renderer_classを明示的に設定する必要がありました。