[장고] 중복 없는 무작위 문자열 기본값 설정하기

소요 시간: 5분

웹 애플리케이션을 개발하다 보면 각 페이지에 고유한 URL이 필요할 때가 있습니다. 이때, 자동으로 고유한 코드를 생성해 주는 방법을 소개합니다.


알고리즘

알고리즘은 다음과 같이 간단합니다:

  1. 특정 문자열 그룹에서 무작위로 문자열을 선택합니다.
  2. 선택된 문자열들을 하나의 문자열로 결합합니다.
  3. 결합된 문자열이 중복되지 않는지 확인합니다. 중복될 경우 1단계로 돌아가고, 중복되지 않으면 해당 값을 저장합니다.


유니크 코드 만들기

코드 생성하기

우선 필요한 라이브러리를 불러옵니다:

import string, random

이제 8자리의 코드를 생성해 보겠습니다:

code = ''.join(random.choices(string.ascii_lowercase), k=8)

여기서 random.choices는 주어진 문자열 리스트에서 입력된 개수만큼 무작위로 선택해 리스트로 반환합니다. string.ascii_lowercase는 소문자 알파벳 문자열을 제공합니다. 이 리스트의 요소들을 공백 없이 연결하여 하나의 코드로 만듭니다. 이를 join 메서드를 통해 구현합니다.

중복 확인

생성된 코드의 중복 여부를 확인하기 위해 Django ORM의 filter와 exists 메서드를 사용합니다:

CustomUser.objects.filter(code=code).exists()

while 문을 사용하여 코드를 반복 생성하고, 중복되지 않는 경우에만 루프를 종료합니다:

while True:
    code = ''.join(random.choices(string.ascii_lowercase), k=8)
    if not CustomUser.objects.filter(code=code).exists():
        break

이제 이 과정을 함수로 만들어 보겠습니다:

def generate_unique_code():
    while True:
        code = ''.join(random.choices(string.ascii_lowercase, k=8))
        if not CustomUser.objects.filter(code=code).exists():
            break
    return code

기본 값으로 설정 

이제 생성한 유니크 코드를 장고 모델의 기본 값으로 설정해보겠습니다. 예를 들어, CustomUser 모델에서 code 필드의 기본 값을 설정하려면 아래와 같이 작성합니다:

from django.db import models

class CustomUser(models.Model):
    code = models.CharField(max_length=8, default=generate_unique_code, unique=True)

위와 같이 설정하면 새로운 CustomUser 인스턴스가 생성될 때마다 자동으로 유니크한 코드가 code 필드에 저장됩니다.


결론

이제 장고에서 무작위로 생성된 중복되지 않는 문자열을 기본값으로 설정하는 방법을 알게 되었습니다. 이 방법을 통해 각 페이지에 고유한 URL을 부여하여 사용자에게 더 나은 경험을 제공할 수 있습니다.

장고 리스트