Post

[Django] auto_now와 auto_now_add의 차이

[Django] auto_now와 auto_now_add의 차이

1. auto_now와 auto_now_add란?


Django에서 모델 클래스를 정의할 때, 생성일자나 수정일자를 필드로써 자주 구성하게 됩니다.
이때, 유용하게 사용할 수 있는 옵션이 바로 auto_nowauto_now_add 입니다.

이 두 옵션은 DateField, TimeField, DateTimeField에서만 제공되며, 각각 다음과 같은 역할을 합니다.

OptionDescriptionExample
auto_now객체가 수정될 때마다 자동으로 현재 날짜 및 시간으로 갱신됩니다.수정일자(updated_at) 필드
auto_now_add객체가 최초 생성될 때 자동으로 현재 날짜 및 시간을 저장합니다.생성일자(created_at) 필드

2. 예제 코드


아래는 auto_nowauto_now_add 옵션의 사용 예시입니다.

1
2
3
4
5
6
7
8
from django.db import models

class Employee(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=50)
    ...
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

위 예시는 Employee 객체를 처음 생성할 때, created_at, updated_at 필드에 현재 날짜 및 시간을 저장합니다.
다음으로 생성된 Employee 객체에서 수정이 일어나면, updated_at 필드만 현재 날짜 및 시간으로 갱신합니다.

3. 주의 사항


필드에 auto_now=True 또는 auto_now_add=True 옵션이 사용되었다면, 해당 값을 수동으로 변경할 수 없습니다.

1
2
3
4
5
6
7
8
9
from datetime import datetime
from models import Employee

employee = Employee.objects.get(id=1)

employee.created_at = datetime.now()  # ❌ 수동 변경 불가능
employee.updated_at = datetime.now()  # ❌ 수동 변경 불가능

employee.save()

위 예시에서 save()를 호출해도 수동으로 지정한 값은 무시되고, created_at은 최초 생성 시점, updated_at은 저장 시점의 현재 날짜 및 시간으로 자동 설정됩니다.

특히 데이터 마이그레이션이나 데이터를 수동으로 삽입해야 하는 경우에는, auto_nowauto_now_add를 비활성화하거나, 직접 값을 설정할 수 있도록 커스텀 구조를 구성하는 것이 요구됩니다.

This post is licensed under CC BY 4.0 by the author.