Enum클래스,choices,classmethod 사용/django에서 테이블 이름 변경
python 내장 Enum 클래스 사용
- 파이썬 3.4부터 제공되는 클래스로 Enum사용 시 저장 공간을 줄일수가 있다.
예를 들면 Female = 0, Male = 1 처럼 표현할 수 있다.
class Gender(Enum):
MALE = 'M'
FEMALE = 'F'
이런식으로 표현할 수 있다.
choices,classmethod 사용
- choices는 필드에 저장할 수 있는 값이 제한적인 경우에 사용한다. choices가 주어지면, 폼 위젯을 사용할 경우 표준 텍스트 필드 대신 선택 가능한 항목을 가진 select box가 되며, 굳이 장고 내부 form을 사용하지않고 project 진행 단계에서 httpie나 postman으로 시험을 해볼때는 choices가 정한 값들 중에서 값을 받게끔 만들어진다.
예를 들면
Wecode(models.Model):
WECODE = 'W'
HOME = 'H'
Destination = (
(WECODE, _('wecode')),
(HOME, _('home')),
)
destination = models.CharField(max_length=3,
choices=Destination,
default=WECODE)
@classmethod
def choices(cls):
return [(tag, tag.value) for tag in Gender]
이런식으로 표현할 수 있다.
-
함수위에
classmethod
는 파이썬에서 지원하는 데코레이터로 @classmethod로 감싼 함수는 첫번째 인자를cls
로 줘야한다(다른말로 넣어도 됨). -
사용 예시
user_gender = models.CharField(max_length=3, choices = Gender.choices())
-
이런식으로 사용가능하다. Gender라는 class의 뒤에 .choices()를 불러주면 cls의 인자를 활용하여 cls의 클래스속성을 가져올 수 있다. 즉, Gender라는 값에서 둘 중 하나만 받는 choices를 불러와 입력 받게 된다.
-
이 부분은 TIL을 떠나 포스팅으로 다시 다루어야 할 부분 같다. 찾아보니 @classmethod와 @staticmethod와 차이점을 살펴보면서 이해하는 것이 좋을 것 같다.
장고에서 테이블 이름 변경하는 방법
class User(models.Model):
.
.
.
class Meta:
db_table = "users"
위의 코드처럼 class 내부에 class Meta라는 클래스를 설정해준 후 데이터베이스의 테이블 이름을 원하는 값으로 할당해주면 된다.