포스트

django에서 db유저 스캔, 삭제하기 쉽게하기

django 웹프레임워크를 사용하는 프로젝트의 루트 경로의 accounts/models.py에는 user에 관한 모델을 정의해놓습니다. django패키지에서 만들어 놓은 User클래스를 가져다가 그대로 쓸 수도 있고, 새롭게 재정의 해서 쓸 수도 있습니다.

그냥 가져다가 쓰면 다음 경로의 클래스를 쓰게 되는 겁니다.

1
from django.contrib.auth.models import User

새롭게 재정의해서 쓴다고 하면,

다음과 같이 django 프레임워크의 contrib.auth.models 에 위치한 AbstractBaseUser라는 클래스를 가져와서 나만의 커스텀 User클래스를 재정의해서 쓰면 됩니다.

1
2
3
4
5
from django.contrib.auth.models import AbstractBaseUser


class User(AbstractBaseUser):
    ...

이렇게 일반과 커스텀 둘 다 설명드린 이유는 django에서 db에 저장한 User를 스캔하고 삭제할 때, db에 저장되어 있는 User의 모델(클래스)와 일치하는 모델을 불러와야 하기 때문입니다.

기본 User모델 사용 시:

1
2
from django.contrib.auth.models import User

커스텀 User모델 사용 시:

1
2
from accounts.models import User  # 커스텀 User 모델을 사용 중인 경우

이제 메소드는 똑같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from accounts.models import User  # 커스텀 User 모델을 사용 중인 경우

# 모든 사용자 확인
def scan_user():
    for user in User.objects.all():
        print(user.username, user.email)

# 특정 사용자 삭제
def delete_user(email: str):
    User.objects.filter(email=email).delete()

# 모든 이메일 비인증 테스트 사용자 삭제 (is_active=False 조건 추가 가능)
def delete_not_active_users():
    User.objects.filter(is_active=False).delete()

# 모든 사용자 삭제 (is_active=False 조건 추가 가능)
def delete_all_users():
    User.objects.all().delete()


실제로 사용하려면 다음과 같이,,

1
2
3
4
5
6
python manage.py shell
>> exec(open("zzz_test_dev/django_user_commands.py", encoding="utf-8").read())
>> scan_user()
메일1@gmail.com
메일2@gmail.com
>> delete_not_active_user()

active하지 않은 메일을 전부 삭제했습니다. ㅎㅎ

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.