序列化程序中有关 DateField 格式的错误
Error about DateField format in serializer
我有一个序列化程序,但由于日期格式的验证错误,我无法验证数据,尽管我确信日期格式是正确的。我想将该字段保留为可选字段,但是当我传递日期值时我无法使其工作。当我不传递任何值时,序列化程序正常工作。
示例:
from rest_framework.serializers import serializers
class SerializerX(serializers.Serializer):
date_x = serializers.DateField(required=False, allow_null=True, format="%Y-%m-%d", input_formats=["%Y-%m-%d"])
s = SerializerX(data={'date_x': '2022-02-16'})
s.is_valid()
s.initial_data = {'date_x': '2022-02-16T00:00:00'} (before calling is_valid())
s.validated_data = {}
s.data = {'date_x': '2022-02-16T00:00:00'}
在我的本地环境中,序列化器工作正常,但在远程开发环境(Kubernetes pod)中,出现以下错误:
Validation error:
{'date_x': [ErrorDetail(string='Date has wrong format. Use one of these formats instead: YYYY-MM-DD.', code='invalid')]}
注意:环境之间的设置没有差异。
我试过:
- 将 DATE_FORMAT = "%Y-%m-%d" 和 DATE_INPUT_FORMATS = ['%Y-%m-%d', ] 添加到设置并删除格式和 input_formats 来自字段定义。
- 将 DATE_FORMAT = "%Y-%m-%d" 和 DATE_INPUT_FORMATS = ['%Y-%m-%d', ] 添加到 REST_FRAMEWORK 设置和从字段定义中删除格式和 input_formats。
- 重写 validation_methods,例如 validate() 和 validate_date_x()
- 禁用USE_L10N
- 像这样定义自定义 DateField class:
from django.utils import formats
class DateFieldX(serializers.DateField):
def to_representation(self, obj):
return formats.date_format(obj, 'Y-m-d')
关于环境:
Django 2.1.7
djangorestframework 3.9.2
Python 3.6.14
当前相关设置:
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
如有任何帮助,我将不胜感激。
提前致谢
我找到了以下解决方案,其关键方面是:
- 将字段定义为 DateTimeField 而不是 DateField
- 确保输入格式始终为字符串
- 覆盖验证方法以确保 DRF 始终将值作为字符串进行管理。
from rest_framework.serializers import serializers
class SerializerX(serializers.Serializer):
date_x = serializers.DateTimeField(
required=False, allow_null=True,
format="%Y-%m-%d",
input_formats=["%Y-%m-%dT%H:%M:%S", "%Y-%m-%d"]
)
def validate(self, value):
return value.strftime('%Y-%m-%d') if value else value
我有一个序列化程序,但由于日期格式的验证错误,我无法验证数据,尽管我确信日期格式是正确的。我想将该字段保留为可选字段,但是当我传递日期值时我无法使其工作。当我不传递任何值时,序列化程序正常工作。
示例:
from rest_framework.serializers import serializers
class SerializerX(serializers.Serializer):
date_x = serializers.DateField(required=False, allow_null=True, format="%Y-%m-%d", input_formats=["%Y-%m-%d"])
s = SerializerX(data={'date_x': '2022-02-16'})
s.is_valid()
s.initial_data = {'date_x': '2022-02-16T00:00:00'} (before calling is_valid())
s.validated_data = {}
s.data = {'date_x': '2022-02-16T00:00:00'}
在我的本地环境中,序列化器工作正常,但在远程开发环境(Kubernetes pod)中,出现以下错误:
Validation error:
{'date_x': [ErrorDetail(string='Date has wrong format. Use one of these formats instead: YYYY-MM-DD.', code='invalid')]}
注意:环境之间的设置没有差异。
我试过:
- 将 DATE_FORMAT = "%Y-%m-%d" 和 DATE_INPUT_FORMATS = ['%Y-%m-%d', ] 添加到设置并删除格式和 input_formats 来自字段定义。
- 将 DATE_FORMAT = "%Y-%m-%d" 和 DATE_INPUT_FORMATS = ['%Y-%m-%d', ] 添加到 REST_FRAMEWORK 设置和从字段定义中删除格式和 input_formats。
- 重写 validation_methods,例如 validate() 和 validate_date_x()
- 禁用USE_L10N
- 像这样定义自定义 DateField class:
from django.utils import formats
class DateFieldX(serializers.DateField):
def to_representation(self, obj):
return formats.date_format(obj, 'Y-m-d')
关于环境:
Django 2.1.7
djangorestframework 3.9.2
Python 3.6.14
当前相关设置:
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
如有任何帮助,我将不胜感激。 提前致谢
我找到了以下解决方案,其关键方面是:
- 将字段定义为 DateTimeField 而不是 DateField
- 确保输入格式始终为字符串
- 覆盖验证方法以确保 DRF 始终将值作为字符串进行管理。
from rest_framework.serializers import serializers
class SerializerX(serializers.Serializer):
date_x = serializers.DateTimeField(
required=False, allow_null=True,
format="%Y-%m-%d",
input_formats=["%Y-%m-%dT%H:%M:%S", "%Y-%m-%d"]
)
def validate(self, value):
return value.strftime('%Y-%m-%d') if value else value