models.Model field의 종류

2021. 7. 27. 10:56python/Django

728x90

https://lhy.kr/django-introduction-to-models

 

models.Model에서 자주 사용되는 field의 종류와 특징에 대해 알아보자.

 

▶ models.CharField

- 텍스트를 입력받을 때 사용하는 필드이다.

- 필수 속성으로 max_length가 있다.

- 기본 위젯으로 TextInput을 가진다.

ex) 아이디, 닉네임, 비밀번호

 

 

▶ models.TextField

- 길이가 매우 긴 텍스트를 입력받을 때 사용하는 필드이다.

- 기본 위젯으로 Textarea를 가진다.

ex) 게시글

 

 

▶ models.DateTimeField

- 날짜와 시간을 저장하는 필드이다.

- auto_now 속성은 업데이트 시각을 저장한다.
- auto_now_add 속성은 최초로 만들어질 때의 시각을 저장한다.
ex) 계정생성, 로그인, 데이터 업로드 등의 날짜 및 시간

 

auto_now=True 사용은 수정일자를 표현할 때,
auto_now_add=True 사용은 생성일자를 표현할 때

i) 수정일자, updated_at
auto_now=True : django model 이 save 될 때마다 현재날짜(date.today()) 로 갱신된다.

그리고 최종수정일자 field option 으로 주로 사용된다.

ii) 생성일자, created_at
auto_now_add=True 는 django model 이 최초 저장(insert) 시에만 현재날짜(date.today()) 를 적용한다.

 


※ 날짜를 저장하는 models.DateField와 시간을 저장하는 models.TimeField가 있는데 가능하면 날짜와 시간 모두를 저장할 수 있는 models.DateTimeField를 사용하자. 어차피 출력할 때는 원하는 값만 보여줄 수 있으니.

 

 

▶ models.AutoField

- 객체가 생성되면 1부터 자동으로 증가하는 기본키(Primary Key)를 생성하는 필드라고 볼 수 있다. 따라서 따로 등록하지 않더라도 모델에 자동으로 추가된다.

ex) 게시글 번호, 객체의 식별자

 

 

▶ models.BooleanField

- boolean 타입의 데이터를 저장하는 필드.

- 기본 위젯으로 CheckBoxInput을 가진다.

 

 

▶ models.EmailField

- 이메일 형식의 데이터를 저장하는 필드.

- 장고가 기본적으로 이메일 형식인지 아닌지를 체크해준다.

 

 

▶ models.URLField

- URL 형식의 데이터를 저장하는 필드.

- 기본 위젯으로 URLInput을 가진다.

- 장고가 기본적으로 URL형식이 맞는지 아닌지를 체크해준다.

 

 

▶ models.PositiveIntegerField

- 0 이상의 정수를 취급하는 필드이다.

ex) 좋아요, 조회수

 

 

▶models.GenericIPAddressField

- IP주소를 저장하는 필드.

- 'IPv4' 와 'IPv6' 모두 지원한다.

ex) 로그인 아이피주소

 

 

▶ models.ForeignKey

- DB의 외래키.
- 1:N의 관계를 부여할 때 사용. 'N'쪽에 선언해준다.

- 첫번째 인자(필수 인자)로 모델을 전달해야한다. 이미 생성된 모델이라면 import 해와서 사용하면 되고 아직 생성 전 모델이라면 'user.User'과 같이 '앱. 모델'형태의 문자열로 선언해 준다.

- 필수 속성으로 on_delete가 있다.

- on_delete=models.CASCADE : '1'쪽을 삭제시 연결된 'N'쪽의 모든 데이터들도 삭제됨

- on_delete=models.PROTECT : 'N'쪽의 데이터가 있을 경우 '1'쪽의 데이터가 삭제되지 않게 보호한다.

ex) 작성자 : 게시글(1 : N), 게시글 : 댓글(1 : N)

 

※ CASCADE 는 예를 들어보면 작성자가 계정을 삭제하면 모든 게시글이 삭제된다거나, 게시글을 삭제하면 게시글의  댓글들이 모두 삭제되는 경우가 CASCADE에 해당된다.

 

 PROTECT 의 예시로 티스토리 블로그의 카테고리 관리창이 있다. 하위목록에 카테고리가 존재할 때는 삭제버튼이 비활성화 되고 하위목록을 지우니 그제서야 삭제버튼이 활성화된다.

티스토리 카테고리 관리창

 

 

▶ models.ManyToManyField

- N:N의 관계를 부여할 때 사용.

- 한 모델안에 동일한 모델을 여러개 연결했을 경우 related_name속성을 등록해줘야 오류가 발생하지 않는다. (이때 related_name속성은 선언해주는 곳을 기준으로 네이밍한다.

- 두 모델을 연결시키면 DB상에 중간 테이블이 생성되는데 이는 장고가 자동으로 만든 테이블이다.

- through, through_fields 속성을 이용해 임의로 중간테이블을 연결할 수 있다.

- through : 중간테이블로 사용할 모델, through_fields : 중간테이블이 연결할 필드

- symmetrical 속성을 이용하여 비대칭성을 만들 수 있다. (SNS 친구추가기능 -> 양쪽 모두 수락해야 친구관계가 되는 경우 N:N 관계이면서 비대칭적이라고 할 수 있다.)

ex) 팔로우-팔로워, 친구추가

 

 

▶ models.OneToOneField

- 1:1의 관계를 부여할 때 사용

- 필수 인자로 연결할 모델, on_delete값을 지정해줘야 한다.

ex) unique 속성을 가진 모델과의 연결

 

 

※ 관계형 필드를 공부하던 중 생긴 의문이 있다. ForeignKey, ManyToManyField, OneToOneField와 같은 관계형 필드를 사용하지 않아도 충분히 동일한 기능들을 만들 수 있는데 왜 굳이 이러한 필드를 사용할까?에 대해서 생각해 본 적이 있다. 이것에 대해 나름대로 답을 내봤는데 그 내용은 다음과 같다.

 

1. 데이터베이스상에서 모델간의 연결성을 알수있다.

- ForeignKey로 연결된 모델은 DB에서 이름뒤에 '_id'가 붙는다. (MySQL기준, 다른 건 안 써봐서 모름.)

 

2. 한 모델로부터 연결된 다른 모델로의 액세스가 가능해진다.

- 이 내용은 3번과 이어진다.

 

3. 관계형 필드를 사용하면 한 줄로 구현할 수 있는 기능들을 직접 코드를 짠다면 불편해진다.

- 관계형 필드를 사용하지 않으면 filter를 사용하여 객체들을 검색하고 그 객체를 이용하여 또 다른 객체를 찾는 행위를 반복할 수밖에 없는데 연결 관계가 복잡해질수록 코드를 일일이 작성하는 것이 번거롭고 가독성 또한 떨어지게 되며 프로그램의 실행 속도 까지 느려지게 된다. 하지만 관계형 필드를 사용하면 다른 모델로의 접근이 가능해지니 아무리 복잡한 관계여도 비교적 간편하고 빠른 속도로 원하는 대상을 탐색할 수 있다.

'python > Django' 카테고리의 다른 글

상대경로 절대경로  (0) 2021.07.28
django 요약  (0) 2021.07.28
data 삭제 후 만들기  (0) 2021.07.26
polls 결과page만들기  (0) 2021.07.26
polls 선택 page만들기  (0) 2021.07.23