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
相关产品推荐
相关产品推荐

