Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Django에서 모델 객체의 변경 이력(History) 추적하기

모델 이력 추적(Model History Tracking)은 모델 객체에 발생한 변경 사항을 기록하는 기능입니다. 어떤 내용이 수정되었는지, 언제 삭제되었는지 등을 추적할 수 있으며, 실수로 삭제된 객체를 복구하는 데도 활용할 수 있습니다. 이 글에서는 django-simple-history 라이브러리를 사용해 Django에서 모델 객체의 변경 이력을 추적하는 방법을 예제와 함께 살펴보겠습니다.

프로젝트 설정하기

먼저 프로젝트, 앱, URL 그리고 모델을 기본적으로 구성해 둡니다.

1. django-simple-history 설치

다음 명령어로 라이브러리를 설치합니다.

pip install django-simple-history

2. settings.py 설정

settings.py 파일에 앱과 미들웨어를 추가합니다.

INSTALLED_APPS += ["simple_history"]
MIDDLEWARE = [
    # 기존 미들웨어 항목들
    'simple_history.middleware.HistoryRequestMiddleware',
]

여기서는 "simple_history" 앱을 등록하고, 변경을 수행한 사용자 정보까지 함께 기록할 수 있도록 미들웨어를 추가했습니다.

urls.pyviews.py에는 특별히 수정할 부분이 없습니다. 주요 작업은 models.pyadmin.py에서 이루어집니다.

3. models.py 작성

models.py에 다음 코드를 추가합니다.

from django.db import models
from simple_history.models import HistoricalRecords

# Create your models here.
class StudentData(models.Model):
    name = models.CharField(max_length=100)
    standard = models.CharField(max_length=100)
    section = models.CharField(max_length=100)
    history = HistoricalRecords()

모델을 정의하고 history = HistoricalRecords() 필드를 추가하면, 해당 모델 객체의 모든 변경 사항이 자동으로 저장됩니다.

4. admin.py 등록

admin.py에 다음 코드를 작성합니다.

from django.contrib import admin
from .models import StudentData
from simple_history.admin import SimpleHistoryAdmin

admin.site.register(StudentData, SimpleHistoryAdmin)

모델을 일반 Admin이 아닌 SimpleHistoryAdmin으로 등록하면, 관리자 페이지에서 각 객체의 변경 이력을 손쉽게 확인할 수 있습니다.

5. 마이그레이션 및 슈퍼유저 생성

이제 아래 명령어를 순서대로 실행합니다.

python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser

여기까지 완료되면 모든 준비가 끝납니다. models.py에 추가한 코드 덕분에 모든 변경 이력 데이터가 별도 테이블에 자동으로 저장되며, 이 데이터는 views.py나 Django 셸에서 언제든 조회할 수 있습니다.

실행 결과 확인

관리자 페이지에서 객체를 생성, 수정, 삭제해 보면 각 시점의 변경 내역이 기록된 것을 확인할 수 있습니다. 기록된 이력은 다음과 같이 views.py 또는 Django 셸에서 쿼리하여 조회할 수 있습니다.

# Django shell에서 이력 조회 예시
obj = StudentData.objects.first()
obj.history.all()  # 해당 객체의 모든 변경 이력 반환

이렇게 django-simple-history를 활용하면 별도의 감사 로그(Audit Log) 시스템을 직접 구축하지 않고도, 누가 언제 어떤 값을 변경했는지 손쉽게 추적하고 필요시 삭제된 데이터까지 복원할 수 있습니다.