Django Rest Framework中DateTimeField字段POST自定义赋值失效,传入值被替换为当前时间问题
问题分析与解决方案
这个问题我之前也碰到过,核心根源就在你模型里的auto_now_add=True参数上——这个配置会让Django在创建对象时强制把字段值设为当前时间,还会自动标记字段为不可编辑状态。哪怕你在POST请求里传了自定义时间,模型层的这个设置也会直接覆盖传入的数据,导致返回的都是当前时间。
具体修复步骤
1. 修改模型字段配置
首先要把active_date_from和active_date_to的auto_now_add=True替换成支持手动覆盖的默认值。我们用django.utils.timezone.now作为默认值,这样请求没传对应字段时会自动用当前时间,传了自定义值就优先用传入的内容。
修改models.py里的对应字段:
from django.utils import timezone class News(models.Model): title = models.CharField(max_length=255) image = models.ImageField( upload_to=image_directory_path, blank=True, null=True ) short_description = models.CharField(max_length=255) description = models.TextField() tag = models.ForeignKey( NewsTag, related_name="product_tag", on_delete=models.SET_NULL, null=True, ) created_at = models.DateTimeField(auto_now_add=True) # 如果你不需要修改created_at,这个配置可以保留 # 替换auto_now_add为灵活的默认值 active_date_from = models.DateTimeField(default=timezone.now) active_date_to = models.DateTimeField(default=timezone.now)
补充:从你的请求体来看,你也传入了
created_at但返回的是当前时间,如果需要手动设置created_at,也要把它的auto_now_add=True改成default=timezone.now,同时确保序列化器里的created_at没设read_only=True。
2. 验证序列化器配置
你的DashboardNewsSerializer已经正确声明了active_date_from和active_date_to字段,还指定了匹配的时间格式,不需要额外修改。只要确认这些字段没设置read_only=True就行,否则哪怕模型改了,序列化器也会拒绝写入。
你现在的序列化器代码是没问题的:
active_date_from = serializers.DateTimeField(format=settings.DATETIME_FORMAT[0]) active_date_to = serializers.DateTimeField(format=settings.DATETIME_FORMAT[0])
3. 测试修复效果
重启服务后再发送之前的POST请求,就能看到返回结果里的active_date_from和active_date_to字段值和你传入的一致了。
额外说明
auto_now_add=True:这是数据库层面的强制配置,对象第一次保存时自动设为当前时间,后续无法修改(除非直接操作数据库),适合不需要人工干预的创建时间字段。default=timezone.now:这是灵活的默认值设置,只有字段没传值时才用当前时间,允许手动传入自定义值覆盖,适合需要用户设置的时间字段。
内容的提问来源于stack exchange,提问作者swor
相关产品推荐
相关产品推荐

