[django] models 문서 - 1
by 코딩무비문서 출처
시작하기에 앞서
django 프로젝트와 app 한 개를 설치
명령어
django-admin startproject <프로젝트 이름>
cd <프로젝트 이름>
django-admin startapp <앱 이름>
저의 경우 <프로젝트 이름> : base, <앱 이름> : myapp 으로 설정
(메인 디렉토리 이름을 base -> docs_practice로 변경했어요)
실행결과
venv 디렉터리는 가상환경 설치한 거라 무시해도 됩니다!
Models
모델은 데이터에 대한 단 하나의 정보의 소스
모델은 저장하고 있는 데이터의 필수적인 행동과 필드 포함
일반적으로, 각각의 모델은 db의 테이블에 매핑
기본사항
파이썬 각각의 models 은 django.db.models.Model를 상속받음
모델의 각각의 필드들은 db의 필드에 해당합니다.
django는 자동으로 생성되는 db access api을 실행시켜 줍니다.
빠른 예제
first_name(성)과 last_name(이름)을 포함하고 있는 Person 모델을 정의
from django.db import models
class Person(models.Model): # Person 테이블
first_name = models.CharField(max_length=30) # first_name 애트리뷰트
last_name = models.CharField(max_length=30) # last_name 애트리뷰트
first_name 과 last_name은 모델의 필드
각각의 필드는 클래스 속성을 지정되어 있으며 데이터베이스 열에 매핑됨
위 모델을 db로 만들면 다음과 같음(postrgresql)
CREATE TABLE myapp_person(
"id" serial NOT NULL PRIMARY KEY,
"first_name" VARCHAR(30) NOT NULL,
"last_name" VARCHAR(30) NOT NULL
);
테이블의 이름 myapp_person은 자동으로 모델의 메타데이터로 유도되며 오버라이딩 가능
db에 다른 이름으로 저장하기
class Person(models.Model): # Person 테이블
first_name = models.CharField(max_length=30) # first_name 애트리뷰트
last_name = models.CharField(max_length=30) # last_name 애트리뷰트
class Meta:
db_table = 'another_name' # 다른 이름으로 db에 저장
id 필드는 자동으로 추가되거나 이 행동 또한 오버라이딩될 수 있음
django 에서는 자동으로 id필드를 기본 키 로 추가
id = models.BigAutoField(primary_key=True) # 특별하지 않은 경우 모든 모델에 추가되어 있음
모델 사용하기
모델을 정의하면, django에게 사용할 모델들이 있다고 알려줄 필요가 있음
django의 settings 파일을 편집하고 INSTALLED_APP 세팅을 models.py가 포함된 앱 이름을 추가하도록 편집
예를 들어 애플리케이션이 모듈 myapp.modles에 있을 경우 , INSTALLED_APPS에 myapp 추가
INSTALLED_APPS에 새로운 앱을 추가할 때,
먼저 manage.py makemigration을 통해 마이그레이션 파일을 생성하고 run manage.py migrate 하는 것을 명심
Fields
모델의 가장 중요한 부분은 데이터베이스 필드 목록을 정의하는 것
필드들은 클래스의 애트리뷰트를 정의
cf ) clean, save, delete와 같은 모델 api에 정의된 이름과 충돌하지 않도록 주의
필드 타입
모델의 각각의 필드는 적합한 필드 클래스의 객체여야 함
Djangos는 몇가지를 결정하는 필드 클래스를 사용함
데이터베이스에 데이터를 저장하는 종류를 알려주기 위한 column 타입
form field을 랜더링하기 위한 HTML 위젯
가장적은 검증 필수요구사항 , djangoadmin에 사용되고 자동으로 생성되는 form인
django는 수십개의 내장된 필드 타입들을 가지고 있음 자세한 링크
django의 내장된 필드를 사용하지 않고쉽게 자신만의 필드를 작성 할 수 있음 자세한 링크
필드 옵션
각각의 필드는 특정한 인수들을 가지고 있음.
예를 들어, CharField는 max_length 인수가 필요
전체적인 필드 옵션은 여기확인
- 만약 True일 경우, Django는 데이터베이스에 NULL값을 저장, default : False
- True일 경우, 그 필드는 빈 칸을 허용, defualt : False
- 이 필드로 사용할 선택으로 사용할 2개 요소를 가진 튜플
- 왼쪽에 있는 것은 DB에 저장되는 것, 오른쪽 화면에 표시되는 것
- default 양식 위젯은 표준 텍스트 필드 대신 선택 상자, 선택 항목으로 선택이 제한
YEAR_IN_SCHOOL_CHOICES = [
('FR','Freshman')
('SO','Sophomore')
('JR','Junior')
('SR','Senior')
('GR','Graduate')
]
객체의 화면에 표시되는 값 확인 - p.get_변수명_display()
- 필드의 기본값, 값이거나 호출 가능한 객체일 수 있음, 호출가능한 경우 새로운 객체가 생성될 때마다 호출됨
- 양식 위젯과 함께 보여지는 도움말, 문서화에 도움을 줌
- True일 경우, 이 필드는 모델의 기본키
만약 모델의 다른 필드에 primary_key = True를 명시하지 않았을 경우, Django는 자동으로 기본키를 가진 숫자필드를 추가함, 따라서 primary_key= True을 반드시 작성하지 않아도 됨
기본키 필드는 읽기만 가능 , 만약 존재하는 객체의 기본키의 값을 변경하고 저장할 경우, 새로운 객체가 생성
- True일 경우, 이 필드는 반드시 테이블 전체에서 유일해야 함
자동적인 기본키 필드
기본으로 django에서는 App.default_auto_field 또는 settings의 DEFAULT_AUTO_FIELD 에서 입벼로 지정된 유형의 자동 증가 기본키를 모델에 제공
id = models.BigAutoField(primary_key = True)
만약 커스텀 기본키를 갖고 싶지 않으면 primary_key = True을 필드 하나에 명시해야 함 ,
만약 Django 가 명시적인 기본키를 본다면, 자동으로 생성되는 id 열을 만들지 않음
각가의 모델은 하나의 primary_key = True가 필요( 없을 경우 자동으로 id 필드가 생성)
Verbose field names
verbose name은 사용자가 사용하는 자세한 의미
ForeignKey, ManyToManyFiels 그리고 OneToOneField을 제외하고, 첫 번째 위치의 인자를 선택
verbose_name이 주어지지 않은 경우 Django는 자동으로 필드의 이름을 이용해서 만듦(밑줄 -> 공백)
class Fruit(models.Model):
name = models.CharField("이름",max_length=100, primary_key=True) # 맨 앞에 verbose_name 작성
long_name = models.CharField(max_length=100,null = True) # 작성 X 이 경우 long name으로 표시
admin 사이트
ForeignKey, ManyToManyFiels 그리고 OneToOneField는 첫 번째 인수로 모델의 클래스가 필요하므로, verbsose_name 인수를 작성해야 함
verbose_named의 첫 글자에 대문자를 사용하지 않는 게 관례
연관(Relationships)
분명히, 관계형 데이터베이스의 힘은 테이블을 서로 연관시키는 데 있음, Djagno은 일대다, 다대다, 일대일 등 세 가지 일반적인 데이터베이스 관계를 정의하는 방법을 제공
일대다 관계
일대다 관계를 정의하기 위하여 django.db.models.ForeignKey를 사용
다른 필드 유형과 마찬가지로 모델의 클래스 속성으로 포함시켜 사용
ForeignKey는 그 모델이 연관된 클래스의 위치 인수가 필요
관례상 외래키 필드의 이름은 해당 모델의 소문자로 쓰는 것이 관례
다대다 관계
대대다 관계를 정의하기 위하여 django.db.models.ManyToManyField를 사용
ManyToManyField는 그 모델이 연관된 클래스의 위치 인수가 필요
class Topping(models.Model):
pass
class Pizza(models.Model):
toppings = models.ManyToManyField(Topping) # 토핑의 경우 여러 개의 피자 , 피자의 경우도 여러 개의 토핑
다대다 관계의 필드 이름은 복수로 표현하는 것이 좋음
다대다 관계는 두 모델중 하나의 필드에 넣어야 함
다대다필드 객체는 Form에 수정될 객체에 생성됨
토핑과 피자의 경우 피자안에 있는 토핑을 고치는 것이 자연스러움
다대다 관계의 추가 필드
관련 스택오버플로우 글
블로그의 정보
코딩무비
코딩무비