You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 15:37:47