Python/Django

[Django] Django Model - Table Field, Relationship

yubi5050 2023. 2. 7. 01:34

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 아무런 행동을 취하지 않는다. 참조무결성을 해칠 위험이 있다.  

 

참고 문헌

https://docs.djangoproject.com/en/4.1/ref/models/fields/

https://velog.io/@sunsuking/Django-Model-%EA%B3%B5%EB%B6%80