現象:
用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() 】
- 可以,登录前,将对应表清空
_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()