在Django REST Framework中将日期以dd-mm-yyyy格式存入数据库
解决方案
首先需要明确:数据库的DateField存储的是日期对象而非字符串格式,你所说的“存入数据库时改为dd-mm-YYYY格式”,实际是指序列化输出(返回给前端)时使用该格式,同时保持输入的YYYY-MM-DD格式不变。
以下是具体实现步骤:
1. 修正Django配置(全局生效)
你的settings.py中DATE_FORMAT配置存在两个问题:
- 格式值应为字符串而非列表
%M代表月份全称(如October),要表示数字月份需用%m
修改后的配置如下:
REST_FRAMEWORK = { 'EXCEPTION_HANDLER': 'common.exception.custom_exception_handler.custom_exception_handler', 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_simplejwt.authentication.JWTAuthentication', ], 'NON_FIELD_ERRORS_KEY': "detail", 'DATE_FORMAT': "%d-%m-%Y", # 输出格式为dd-mm-YYYY 'DATE_INPUT_FORMATS': ["%Y-%m-%d"] # 指定接受的输入格式为YYYY-MM-DD }
这样全局所有DateField都会自动处理输入输出格式,无需修改Serializer。
2. 单独配置Serializer(局部生效)
如果不想修改全局配置,可直接在Serializer的字段上指定输入输出格式:
class StudentSerializer(serializers.Serializer): start_date = serializers.DateField( input_formats=["%Y-%m-%d"], # 接受YYYY-MM-DD格式的输入 format="%d-%m-%Y" # 输出为dd-mm-YYYY格式 ) end_date = serializers.DateField( input_formats=["%Y-%m-%d"], format="%d-%m-%Y" )
关键说明
- 输入阶段:DRF会自动将请求中的
YYYY-MM-DD字符串转换为Pythondate对象,存入数据库的是标准日期类型,不存在字符串格式问题 - 输出阶段:通过
format配置将date对象序列化为dd-mm-YYYY格式的字符串返回
内容的提问来源于stack exchange,提问作者Abbas Shaikh
相关产品推荐
相关产品推荐

