Django

장고에서 auto_now_add=True 인 필드 값을 커스텀 값으로 넣고 싶을 때

cocojen 2024. 8. 13. 10:05

장고에서 모델을 정의할 때 date나 datetime 필드인 경우에 auto_now_add=True 옵션을 주는 경우가 많다. 이 옵션은 object 가 최초로 생성될 때 자동으로 해당 필드를 현재시각(날짜)로 세팅해준다.

 

그런데 이 값은 내가 원하는 값으로 오버라이드 할 수가 없기 때문에, 만약 객체 생성 시에 원하는 다른 값을 넣어준다면 무시된다. 그래서 만약에 테스트나 다른 이유로 auto_now_add=True 인 필드에 커스텀 값을 넣어주어야 한다면, 생성 후에 save() 를 통해 값을 업데이트 해주는 것이 간편하다. (나는 테스트 때문에 객체의 created_at 필드를 마치 과거에 생성된 것 처럼 만들어야 해서 이 방법을 사용했다)

 

auto_now_add 옵션은 처음 생성될 때만 그때의 시간으로 값을 넣어주기 때문에 save()를 통해 객체 생성 후에 업데이트 할 때는 괜찮다. 

order1, order2, order3 = OrderFactory.create_batch(3)
order1.created_at = date1
order1.save()
order2.created_at = date2
order2.save()
order3.created_at = date3
order3.save()

 

참고) 만약에 datetime, date 필드를 생성 시에 입력 가능하게 만들고 싶어서, auto_now_add 옵션 자체를 바꿀 필요성을 느낀다면 models.DateField(default=timezone.now)로 줘서, 디폴트로 현재 시간의 값을 주지만 커스텀으로 입력할 수 도 있게 editable 하게 만드는 방법이 있다. 하지만 개인적인 생각으로, 보통 default 값을 현재 시각으로 주는 경우는 객체가 생성된 시간을 기록하기 위함인데, 다른 목적을 위해 그런 필드를 editable 하게 만드는 건 어색하다고 생각한다. 만약 created_at 을 조작할 필요가 있다면 위에서 기술한 방법처럼 객체 생성 후에 save()로 해당 필드만 업데이트 하는 것이 좋을 것 같다.

 

https://docs.djangoproject.com/en/4.1/ref/models/fields/#django.db.models.DateField.auto_now_add

 

Model field reference | Django documentation

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

save() 이외에 create()를 오버라이딩 하거나 직접 구현한 contextmanager로 auto_now_add 필드를 커스텀 세팅하는 법에 대해 정리한 블로그

https://www.untangled.dev/2023/09/10/django-factoryboy-autonow/