我有一个序列化程序,由于日期格式的验证错误,我无法验证数据,尽管我确信日期格式是正确的。我想将该字段保留为可选字段,但在传递日期值时无法使其工作。当我没有传递任何值时,序列化程序就会正常工作。
示例:
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
- 覆盖validate((和validate_date_x((等validation_methods
- 禁用USE_L10N
- 定义自定义DateField类如下:
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
s=SerializerX(data={'date_x':'2022-02-16'(
到
s=SerializerX(data={'date_x':日期时间.strptime('2022-02-16','%Y-%m-%d'(}(