Django save : auto_now_add NULL error

2022-07-22 11:14:23 浏览数 (1)

現象:

用object.save 登录数据时,登录时间报错 违反非空制约 NULL

代码语言:javascript复制
略 "employee"の列"created_at"のNULL値が非NULL制約に違反しています

原因:

用object.save 登录数据时,若该数据已经存在(primary key),则执行update。

代码语言:javascript复制
class BaseModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='登録日時')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='更新日時')

class EmployeeInfo(BaseModel):
    code = models.CharField(max_length=20, primary_key=True, verbose_name='従業員番号')
    略

代码语言:python代码运行次数:0复制
test.py
class Command(BaseCommand):
    help = "create test data"

    @transaction.atomic
    def handle(self, *args, **options):
    
      for i in range(1, 5):
            se = EmployeeInfo()
            se.code = f'e00{i}'
            se.created_by = 'admin'
            se.updated_by = 'admin'
            # se.created_at = datetime.today()
            se.save()

首次执行时,save(insert)处理,登录数据库(code:e001~e004) ※code为主键

代码语言:javascript复制
(smsenv) PS D:Projectstestpj> python manage.py test

再次执行时,save处理执行(update)处理

因为model se 未设定created_at 字段,该字段为空值,报错

关于 auto_now_add ・auto_now

简言之

auto_now_add:insert 登录处理时,自动设定系统时间

auto_now:update 更新处理时,自动设定系统时间

解决方案:

1,若明确要执行更新处理,先执行检索,在对检索结果更新,保存。

代码语言:python代码运行次数:0复制
se = EmployeeInfo.objects.get(pk=1)
se.name = '更新後名称'
se.save()

2,若只是做成测试数据,

  • 可以加上 【se.created_at = datetime.today() 】
  • 可以,登录前,将对应表清空
代码语言:python代码运行次数:0复制
            _delete_all(EmployeeInfo)
            se = EmployeeInfo()
            se.code = f'e00{i}'     # 主键
            # se.created_at = datetime.today()
            se.save()

def _delete_all(class_type):
        class_type.objects.all().delete()  

0 人点赞