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

Django模型created_at字段(auto_now_add=True)如何手动指定创建时间?

解决Django模型中auto_now_add字段无法通过序列化器手动赋值的问题

方案一:在序列化器中显式声明字段并允许写入

auto_now_add=True会让Django将该字段标记为不可编辑(editable=False),DRF序列化器默认会把这类字段设为read_only=True,导致传入的created_at被忽略。你可以在序列化器里显式定义这个字段,将read_only设为False:

from rest_framework import serializers
from .models import Temp

class TempSerializer(serializers.ModelSerializer):
    created_at = serializers.DateTimeField(read_only=False)

    class Meta:
        model = Temp
        fields = ['user', 'created_at']

之后使用序列化器创建实例时,传入的created_at就会生效:

import datetime
from .serializers import TempSerializer
from django.contrib.auth.models import User

user = User.objects.first()
data = {'user': user.id, 'created_at': datetime.datetime(2024, 1, 1, 10, 0, 0)}
serializer = TempSerializer(data=data)
if serializer.is_valid():
    serializer.save()

方案二:修改模型字段,用default替代auto_now_add

如果需要频繁手动设置created_at,可以修改模型字段定义,用default替代auto_now_add。这样字段既会默认填充当前时间,又支持手动传入值覆盖:

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone

class Temp(models.Model):
    user = models.ForeignKey(to=User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(default=timezone.now)

此时默认的ModelSerializer就会允许传入created_at参数,无需额外修改序列化器:

data = {'user': user.id, 'created_at': datetime.datetime(2024, 1, 1, 10, 0, 0)}
serializer = TempSerializer(data=data)
if serializer.is_valid():
    serializer.save()

方案三:通过save()方法直接传入参数(临时场景)

如果只是偶尔需要手动设置时间,无需修改序列化器或模型,在序列化器验证通过后,调用save()时直接传入created_at即可:

import datetime
from .serializers import TempSerializer
from django.contrib.auth.models import User

user = User.objects.first()
data = {'user': user.id}
serializer = TempSerializer(data=data)
if serializer.is_valid():
    serializer.save(created_at=datetime.datetime(2024, 1, 1, 10, 0, 0))

内容的提问来源于stack exchange,提问作者lornejad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:13:20