- Published on
auto_now_add=True 로 정의된 필드 값은 수정할 수 없다
- Authors
- Name
- 마롱
보통 장고에서 모델 인스턴스가 생성되는 시점의 시각을 저장하고 싶을 때 auto_now_add=True
옵션을 사용한다.
DateField(auto_now_add=True)
DateTimeField(auto_now_add=True)
그런데 특정 상황에서 DateTimeField(auto_now_add=True)
로 정의된 생성일시 필드를 다른 값으로 수정하여 저장(save()
)했더니 예상했던 것처럼 수정되지 않는 문제가 발생했다.
공식문서를 살펴보니 다음과 같은 설명이 적혀 있었다.
DateField.auto_now_add
Automatically set the field to now when the object is first created. Useful for creation of timestamps. Note that the current date is always used; it’s not just a default value that you can override. So even if you set a value for this field when creating the object, it will be ignored. If you want to be able to modify this field, set the following instead of auto_now_add=True:
- For DateField: default=date.today - from datetime.date.today()
- For DateTimeField: default=timezone.now - from django.utils.timezone.now()
객체가 처음 생성될 때 필드의 값을 현재 시각으로 자동으로 설정합니다. 타임스탬프 생성에 유용합니다. 항상 현재 날짜가 사용됩니다. 이는 단순히 재정의(override)할 수 있는 기본값이 아닙니다. 따라서 객체를 생성할 때 이 필드에 값을 설정하더라도 무시됩니다. 이 필드의 값을 수정하려면 auto_now_add=True 대신 다음 옵션을 사용하세요.
- DateField 사용 시: default=date.today - from datetime.date.today()
- DateTimeField 사용 시: default=timezone.now - from django.utils.timezone.now()
따라서 값을 수정하려는 필드에서 auto_now_add=True
옵션을 제거하고 공식문서의 가이드처럼 default
옵션을 사용하는 방식으로 수정한 뒤, 해당 필드 값을 원하는 값으로 수정할 수 있었다.