序列化程序中有关 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')]}

注意:环境之间的设置没有差异。

我试过:

  1. 将 DATE_FORMAT = "%Y-%m-%d" 和 DATE_INPUT_FORMATS = ['%Y-%m-%d', ] 添加到设置并删除格式和 input_formats 来自字段定义。
  2. 将 DATE_FORMAT = "%Y-%m-%d" 和 DATE_INPUT_FORMATS = ['%Y-%m-%d', ] 添加到 REST_FRAMEWORK 设置和从字段定义中删除格式和 input_formats。
  3. 重写 validation_methods,例如 validate() 和 validate_date_x()
  4. 禁用USE_L10N
  5. 像这样定义自定义 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