Model - Field Type
필드 타입 | 설명 |
BooleanField | True / False 이진 논리 필드 |
CharField | 문자열 값 (일반적으로 짧은) |
TextField | 문자열 값 (일반적으로 긴) |
EmailField | 유휴한 이메일 주소인지 체크 (EmailValidator) |
IntegerField | 정수 데이터 저장 필드 |
PostiveIntegerField PositiveBigIntegerField |
0 or 양수의 정수 필드 |
FloatField | 실수 데이터 저장 필드 |
DecimalField | 고정 소수점 필드 (ex. 4.222) |
DateField | 날짜 데이터 저장 필드 Python의 Datetime.date에 대응되는 필드 |
DateTimeField | 날짜 + 시간 데이터 저장 필드 Python의 Datetime.datetime에 대응되는 필드 |
TimeField | 시간 저장 필드 Python의 Datetime.time 대응 |
FileField | 파일 업로드 필드 |
ImageField | 업로드한 이미지가 유효한지 검증 |
URLField | URL을 위한 CharField (max_length=200) |
UUIDField | UUID Field를 저장하기 위한 필드 char(32) PK 필드 대신하기에 좋은 필드 |
GenericIPAddressField | IP 저장 필드 (ipv4, ipv6) |
- 좋은 참고 blog : 링크
Model - Field Option
필드 옵션 (*보편 적인 것 위주로) | 설명 |
null | DB 필드 NULL 허용 여부 (Default : False) |
blank | 입력값 empty 값 허용 여부 (Default : False) |
default | Default 값 지정 |
unique | Table 내 해당 값 unique 여부 (Default : False) |
choices | (DB 값, HTML 표시 값)의 Tuple 형태 옵션 |
help_text | 필드 입력 도움말 |
verbose_name | human-readable한(사람이 읽기 좋은) 필드 네임 |
max_lenght | 최대 길이 |
primary_key | 특정 필드를 기본키로 (미설정시 자동 정수 필드로 생성됨) |
unique_for_date, _month.. | datetime을 고유하게 쓰고 싶을 때 ex) title이란 field에 unique_for_date='pub_date' |
Tips
1. Date, Datetime 필드 - auto_now vs auto_now_add
- auto_now = True : 현재 일시를 timezone의 date.today() 자동 셋팅
- auto_now_add = True : insert (신규 생성)인 경우만 자동 셋팅
- auto_now_add, auto_now는 같이 쓸 수 없음
ex) auto_now = True 설정시, datefield가 insert나 update시 계속 최신으로 갱신됨
ex) auto_now_add = True 설정시, datefield가 insert시에만 최신으로 갱신됨
2. CharField, TextField 비교
- CharField / TextField에 대해서는 null=True는 사용 X
- Django 권장은 빈 값은 빈 문자열 ('')로 저장 하는 것
- 만약 해당 필드를 필수를 만들지 않으려면 blank=True
- textfield는 max_length가 적용이 안됨
ex) 굳이 입력해도 되지 않는 CharField에 blank = True 설정 하여 빈 문자열('')도 허용함
3. Datefield, DatetimeField null 값?
- 값을 기본적으로 안받고 싶을 때 null=True으로 설정 가능
- null = True(for db), blank=True (for admin)
- 값 입력시에는 python은 none으로 입력해주어야 함
4. PhoneNumber Field
- 외부 라이브러리 중에 phone number fields를 설치하여 사용가능.
- CharField vs PhonenumberFields 중에 선택 기준은 나라 코드를 구분할 필요가 있는지 여부로도 진행 가능함
- 관련 링크
5. user의 is_active
- 활성계정, 휴면계정, 탈퇴계정 구현시 방법
- 1) UserStatus Table 생성
- 2) 활성계정 / 휴면, 탈퇴 계정으로 분리하고 휴면일, 탈퇴일 field로 관리 (date는 none 가능)
6. Django max_length의 한글, 영어 차이
- max_length의 숫자는 varchar와 같은 개념
- 한글 영어 모두 1글자씩으로 이해 (byte 단위 아님)
7. PositiveIntegerField vs BigPositiveIntegerField 차이
- PositiveIntegerField : (~21억) : ex) 갯수, 횟수, 일 수
- BigPositiveIntegerField : (~93경) : ex) 금액, 수치
8. DecimalField 활용
- 위경도로 활용시 소수점 7자리 정도 까지가 유효
Model - Table Meta Option
종류 | 설명 |
db_table | Table 명 |
Ordering | 기본 정렬 정의 (내림차순 시 -) |
Indexes | Model의 Index 지정 |
unique_together | 여러 필드를 묶어서 unique 처리 |
DB - Table Relationship Type (1:1, 1:N, N:M)
👉 1. One to One Filed
- 한 개의 객체가 다른 한 개의 객체를 가리킬때 사용
- ForeignKey의 unique=True 속성과 동일한 구조
- ex) 'USER_PROFILE' Table과 'USER' Table 간의 'user' 필드 공통 사용
user = models.OneToOneField(user, on_delete=models.CASCADE)
👉 2. One to Many (Foreign Key)
- 모델의 1 : N 관계를 나타내기 위해 사용
- ex) 'COMMENT' Table의 'post' Field가 'POST' Table의 'post' Field를 Foreign Key로 참조함
post = models.ForeignKey(Post, on_delete=models.CASCADE)
👉 3. Many to Many
- 모델의 M : N 관계를 나타내기 위해 사용
- ex) 'PIZZA' Table에서 'TOPPING' 테이블을 참조하는 'topping' Field 생성
toppings = models.ManyToManyField('Topping', related_name='pizzas')
pineapple.pizzas.all() # <QuerySet [<Pizza: Hawaiian>]>
- ManyTo Many 정의 시 두 테이블 사이의 관계를 관리해주는 중간 테이블 생성해준다. ('PIZZA_TOPPING')
- 데이터 추가/쿼리는 양쪽 Table에서 모두 가능하다.
DB - 테이블 관계 옵션 종류
👉 on_delete 설정
인자 | 외래키 참조 원본 값이 삭제될때 | |
CASCADE | 외래키를 포함하는 모델 인스턴스(row)도 삭제 | 참조하고 있는 테이블서 삭제시 참조 테이블도 같이 삭제됨 |
PROTECT | protected error를 발생 (삭제시 연관된 필드가 있다면 막음) | |
RESTRICT | restricted error를 발생 (삭제시 연관된 필드가 있다면 막음) | 참조하고 있는 테이블서 삭제가 제한됨 |
SET_NULL | 값을 null로 바꿔준다. (null=True 일때만 가능) | 참조하고 있는 테이블서 삭제시 참조 테이블은 null로 설정됨 |
SET_DEFAULT | 값을 default 값으로 바꿔준다. | 참조하고 있는 테이블서 삭제시 참조 테이블은 default 로 설정됨 |
SET | 값을 SET에 설정된 함수 등에 의해 설정 | |
DO_NOTHING | 아무런 행동을 취하지 않는다. 참조무결성을 해칠 위험이 있다. |
참고 문헌
'Python > Django' 카테고리의 다른 글
[Django] Django Models 와 @property (1) | 2024.06.16 |
---|---|
[Django] Prefetch 에 대한 이해 (0) | 2024.05.19 |
[Django] 간단한 메일 전송 기능 구현 (by. Gmail ) (0) | 2022.11.18 |
[Django] Pagination 방법 비교 (Feat. Django, DRF) (0) | 2022.11.10 |
[Django] Django Pagination (by. Django Paginator) (0) | 2022.11.10 |