Django Model Info
데이터베이스 구조를 Python 클래스로 정의하는 핵심 파일입니다.
- model = DB의 테이블
- Field = DB의 컬럼
Field Type
- CharField: 제한된 문자열
- TextField: 긴 텍스트
- DateTimeField: 날짜와 시간
- DateField: 날짜
- IntegerField: 정수
- ForeignKey: 다른 모델과의 관계
- AutoField: IntegerField와 기본적으로 동일하나, 자동적으로 증가하는 field
- BooleanField: true/false 값을 저장하는 필드
- URLField: CharField와 동일하나, URLValidator를 사용 BUT url 패턴에 매칭이되는 Regex(정규식)이 조건으로 걸려 있다.
- EmailField: URL과 동일
- UUIDField: "Universal Unique Identifier" -공식문서확인-
Field Options
-
기본 필드 옵션
- null
데이터베이스에서 NULL 값 허용 여부를 결정합니다. 기본값은 False이며, 문자열 기반 필드에서는 사용을 피하는 것이 좋습니다.
- blank
폼 유효성 검사에서 빈 값 허용 여부를 결정합니다. null과는 다른 개념으로, 데이터베이스가 아닌 검증 단계에서 동작합니다.
- choices
필드에 대한 선택 옵션을 제한합니다.
- default
필드의 기본값을 설정합니다. 값이나 호출 가능한 객체를 지정할 수 있으며, 새 객체가 생성될 때마다 호출됩니다.
-
고급 필드 옵션
- unique
해당 필드의 값이 테이블 전체에서 고유해야 함을 지정합니다. 중복된 값을 방지하고자 할 때 사용합니다.
- primary_key
해당 필드를 모델의 기본 키로 지정합니다. True로 설정하지 않으면 Django가 자동으로 ID 필드를 생성합니다.
- db_index
해당 필드에 대해 데이터베이스 인덱스를 생성할지 여부를 결정합니다.
- help_text
폼 위젯과 함께 표시될 도움말 텍스트를 지정합니다. 문서화에 유용합니다.
이러한 필드 옵션들을 적절히 조합하여 사용하면 데이터베이스 스키마를 더욱 정교하게 설계할 수 있습니다.
내부 클래스 Meta를 사용해서 모델Meta데이터를 제공합니다.
모델 메타 데이터는 정렬 순서지정, 데이터베이스 테이블 이름 or 사람이 읽을 수 있는 복수 이름과 같은 -필드가 아닌 모든것~!-이라고 보면 됩니다.
💡 Model에 Meta를 추가하는 것은 선택사항입니다.
Manager 속성
objects 속성
- 모든 Django 모델은 기본적으로 objects라는 Manager 속성을 가집니다.
- Manager는 데이터베이스 쿼리 작업을 위한 인터페이스를 제공합니다.
- Manager는 모델 클래스를 통해서만 접근 가능하며, 인스턴스를 통해서는 접근할 수 없습니다.
주요 메서드
str() 메서드
- 모델 인스턴스의 문자열 표현을 반환하는 Python 매직 메서드입니다.
- 관리자 페이지나 콘솔에서 객체를 표시할 때 사용됩니다.
get_absolute_url()
- 객체의 URL을 계산하는 방법을 Django에 알려주는 메서드입니다.
- 관리자 인터페이스에서 사용되며, 객체의 고유 URL이 필요할 때 호출됩니다.
메서드 오버라이딩
save() 메서드 커스터마이징
python
def save(self, *args, **kwargs):
do_something()
super().save(*args, **kwargs) # 실제 저장 메서드 호출
do_something_else()
- 객체 저장 시 추가 동작을 수행하기 위해 자주 오버라이딩됩니다.
- super().save()를 호출하지 않으면 실제 데이터베이스 저장이 이루어지지 않습니다.
모델 상속
Django는 세 가지 타입의 모델 상속을 제공합니다:
추상 기본 클래스
- 여러 모델에서 공통 필드를 재사용할 때 사용
- Meta 클래스에 abstract = True 설정이 필요
다중 테이블 상속
- 각 모델이 자체 데이터베이스 테이블을 가짐
- 부모-자식 관계가 OneToOneField로 자동 연결됨
프록시 모델
- 모델의 Python 레벨 동작만 수정할 때 사용
- 새로운 테이블을 생성하지 않음