django-model-utils 패키지는 pip install로 설치 가능하며, django 내장 라이브러리는 아니다. Model에서 이 패키지의 유용한 모델들을 상속받아 사용할 수 있다.
SoftDeletableModel
도 이 패키지에 존재하며 우리의 모델에 상속받아 사용할 수 있다.
class SoftDeletableModel(models.Model):
"""
An abstract base class model with a ``is_removed`` field that
marks entries that are not going to be used anymore, but are
kept in db for any reason.
Default manager returns only not-removed entries.
"""
is_removed = models.BooleanField(default=False)
class Meta:
abstract = True
objects = SoftDeletableManager(_emit_deprecation_warnings=True)
available_objects = SoftDeletableManager()
all_objects = models.Manager()
def delete(self, using=None, soft=True, *args, **kwargs):
"""
Soft delete object (set its ``is_removed`` field to True).
Actually delete object if setting ``soft`` to False.
"""
if soft:
self.is_removed = True
self.save(using=using)
else:
return super().delete(using=using, *args, **kwargs)
해당 모델의 개념을 코드를 통해 이해해보자. boolean 필드인 is_removed라는 필드가 추가되며, delete()라는 오버라이딩된 메서드가 주어진다. 이 메서드는 만약 soft일 경우 is_removed만 = True로 바꾸는 소프트 삭제
를 수행한다.
제공되는 3개의 매니저가 존재하며, 가장 기본의 objects매니저는 인자로 담긴 경고메세지는 나중에 없어질 수 있다는 것이라고 한다. SoftDeletableManager는 기본적으로 조회시 is_removed = False인 레코드들만 반환할 것이다.
우리의 모델에서 소프트 삭제 모델을 상속받는다면 다음과 같은 효과를 가질 수 있다.
예를 들어 자신의 카카오톡의 채팅 데이터를 지웠다고 가정해보자. 특별한 경우에는 이를 복구하여, 활용하는 경우가 존재할 것이다. DB에서 데이터가 하드삭제되는 것은 매우 주의를 기울여야 한다. 이용자가 삭제를 결정했다 하더라도 백엔드에서 해당 데이터가 정말로 삭제되서는 안되는 경우가 많다.
사용자가 게시한 댓글이나 게시물을 삭제하더라도 완전히 삭제하지 않고, 삭제되었음을 표시하여 데이터를 보존할 수 있다. 이는 커뮤니티의 활동 이력을 유지하고 사용자 간의 상호작용을 추적하는 데 도움이 될 수 있다.
완전한 삭제는 없다는 것이다. 이용자가 삭제를 결정한 데이터도 활용에 대한 승인만 존재한다면 삭제할 이유가 없으니 is_removed같은 field로 클라이언트의 전해줄 레코드들만 전해줄 수 있다.
현재 사용하는 장고의 모델 대부분에서 이를 상속받아 사용중이다. 현재는 모델이 많이 없고 실제배포단계가 아니기때문에 일단은 하드삭제를 모두 막아놓았다
데이터베이스의 무결성을 해칠 수 있으며, 쓸데 없는 데이터들이 쌓일 수 있다.