Flutter向Django API提交日期数据报错,请求格式该如何处理?
解决方案
问题核心是Flutter的DateTime对象无法直接被JSON序列化,而Django的DateField仅接受ISO 8601标准的日期字符串(格式为YYYY-MM-DD)。你需要在发送请求前将DateTime对象转换为对应格式的字符串,具体方法如下:
1. 手动转换日期格式
构造请求数据时,直接提取DateTime对象的年月日并拼接成标准格式:
// 假设dateOfBirth、dateOfContamination是DateTime类型变量 final requestData = { "username": "test_user", "password": "test_pass", "date_of_birth": "${dateOfBirth.year}-${dateOfBirth.month.toString().padLeft(2, '0')}-${dateOfBirth.day.toString().padLeft(2, '0')}", "date_of_contamination": dateOfContamination.toIso8601String().split('T')[0], // 截取ISO字符串的日期部分 // 其他字段... }; // 用Dio发送POST请求 final response = await dio.post('/api/users/', data: requestData);
2. 使用intl包简化格式化
如果手动拼接太繁琐,可以借助Flutter的intl工具包快速格式化:
- 在
pubspec.yaml中添加依赖:
dependencies: intl: ^0.18.1
- 导入并使用
DateFormat类:
import 'package:intl/intl.dart'; final dateFormatter = DateFormat('yyyy-MM-dd'); final requestData = { // ...其他字段 "date_of_birth": dateFormatter.format(dateOfBirth), "date_of_contamination": dateFormatter.format(dateOfContamination), };
关键提示
Postman能正常请求,本质是你在Postman中提交的是YYYY-MM-DD格式的字符串,而非DateTime对象。只要Flutter端发送的日期字符串格式和Postman一致,Django的CreateUserSerializer就能正确解析。
内容的提问来源于stack exchange,提问作者Mikelenjilo
相关产品推荐
相关产品推荐

