102 lines
4.1 KiB
Python
102 lines
4.1 KiB
Python
|
|
#!/usr/bin/env python
|
||
|
|
"""
|
||
|
|
중복된 Person 데이터를 정리하는 스크립트
|
||
|
|
"""
|
||
|
|
|
||
|
|
import os
|
||
|
|
import sys
|
||
|
|
import django
|
||
|
|
|
||
|
|
# Django 설정
|
||
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'A_core.settings')
|
||
|
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||
|
|
django.setup()
|
||
|
|
|
||
|
|
from B_main.models import Person
|
||
|
|
from django.contrib.auth.models import User
|
||
|
|
|
||
|
|
def clean_duplicates():
|
||
|
|
"""중복된 Person 데이터 정리"""
|
||
|
|
print("=" * 60)
|
||
|
|
print("중복 Person 데이터 정리")
|
||
|
|
print("=" * 60)
|
||
|
|
|
||
|
|
# 전화번호별로 그룹화
|
||
|
|
phone_groups = {}
|
||
|
|
for person in Person.objects.all():
|
||
|
|
if person.연락처:
|
||
|
|
if person.연락처 not in phone_groups:
|
||
|
|
phone_groups[person.연락처] = []
|
||
|
|
phone_groups[person.연락처].append(person)
|
||
|
|
|
||
|
|
deleted_count = 0
|
||
|
|
|
||
|
|
for phone, persons in phone_groups.items():
|
||
|
|
if len(persons) > 1:
|
||
|
|
print(f"\n전화번호 {phone}에 대한 중복 발견:")
|
||
|
|
|
||
|
|
# 회원가입 상태별로 분류
|
||
|
|
registered = [p for p in persons if p.회원가입상태 == '회원가입']
|
||
|
|
not_registered = [p for p in persons if p.회원가입상태 == '미가입']
|
||
|
|
withdrawn = [p for p in persons if p.회원가입상태 == '탈퇴']
|
||
|
|
|
||
|
|
print(f" 회원가입: {len(registered)}개")
|
||
|
|
print(f" 미가입: {len(not_registered)}개")
|
||
|
|
print(f" 탈퇴: {len(withdrawn)}개")
|
||
|
|
|
||
|
|
# 정리 로직
|
||
|
|
if registered:
|
||
|
|
# 회원가입된 것이 있으면 나머지 삭제
|
||
|
|
keep_person = registered[0]
|
||
|
|
to_delete = persons[1:] # 첫 번째 것 제외하고 모두 삭제
|
||
|
|
|
||
|
|
print(f" 유지: {keep_person.이름} (ID: {keep_person.id}, 회원가입상태: {keep_person.회원가입상태})")
|
||
|
|
|
||
|
|
for person in to_delete:
|
||
|
|
print(f" 삭제: {person.이름} (ID: {person.id}, 회원가입상태: {person.회원가입상태})")
|
||
|
|
person.delete()
|
||
|
|
deleted_count += 1
|
||
|
|
|
||
|
|
elif not_registered:
|
||
|
|
# 미가입만 있으면 첫 번째 것만 유지
|
||
|
|
keep_person = not_registered[0]
|
||
|
|
to_delete = not_registered[1:] + withdrawn
|
||
|
|
|
||
|
|
print(f" 유지: {keep_person.이름} (ID: {keep_person.id}, 회원가입상태: {keep_person.회원가입상태})")
|
||
|
|
|
||
|
|
for person in to_delete:
|
||
|
|
print(f" 삭제: {person.이름} (ID: {person.id}, 회원가입상태: {person.회원가입상태})")
|
||
|
|
person.delete()
|
||
|
|
deleted_count += 1
|
||
|
|
|
||
|
|
elif withdrawn:
|
||
|
|
# 탈퇴만 있으면 첫 번째 것만 유지
|
||
|
|
keep_person = withdrawn[0]
|
||
|
|
to_delete = withdrawn[1:]
|
||
|
|
|
||
|
|
print(f" 유지: {keep_person.이름} (ID: {keep_person.id}, 회원가입상태: {keep_person.회원가입상태})")
|
||
|
|
|
||
|
|
for person in to_delete:
|
||
|
|
print(f" 삭제: {person.이름} (ID: {person.id}, 회원가입상태: {person.회원가입상태})")
|
||
|
|
person.delete()
|
||
|
|
deleted_count += 1
|
||
|
|
|
||
|
|
print(f"\n총 {deleted_count}개의 중복 데이터가 삭제되었습니다.")
|
||
|
|
|
||
|
|
# 최종 확인
|
||
|
|
print("\n최종 중복 확인:")
|
||
|
|
final_phone_counts = {}
|
||
|
|
for person in Person.objects.all():
|
||
|
|
if person.연락처:
|
||
|
|
final_phone_counts[person.연락처] = final_phone_counts.get(person.연락처, 0) + 1
|
||
|
|
|
||
|
|
final_duplicates = {phone: count for phone, count in final_phone_counts.items() if count > 1}
|
||
|
|
if final_duplicates:
|
||
|
|
print("여전히 중복된 전화번호가 있습니다:")
|
||
|
|
for phone, count in final_duplicates.items():
|
||
|
|
print(f" {phone}: {count}개")
|
||
|
|
else:
|
||
|
|
print("모든 중복이 해결되었습니다.")
|
||
|
|
|
||
|
|
if __name__ == '__main__':
|
||
|
|
clean_duplicates()
|