Model 모델은 데이터에 대한 소스이다. 여기에는 저장중인 데이터의 필수 필드와 동작이 포함되어 있다. 일반적으로 각 모델은 단일 데이터베이스 테이블에 매핑된다.
- 각 모델은 django.db.models.Model 을 서브클래스로 하는 파이썬 클래스이다.
- 모델의 각 속성들은 데이터베이스 필드를 나타낸다.
- Django는 자동으로 generate된 DB엑세스 API를 제공한다.
간단한 models.py 예제
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
위의 Person 모델은 다음과 같은 데이터베이스 테이블을 생성한다.
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
Model 사용하기
모델이 myapp.models일 경우 settings.py -> INSTALLED_APPS 에 앱 등록
INSTALLED_APPS = [
#...
'myapp',
#...
]
새 앱을 추가할 때마다 manage.py migrate를 해주어야 한다.
Field
모델 API와 충돌하는 필드 이름을 사용하면 안된다.
(ex - clean, delete, save 등)
from django.db import models
class Musician(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
instrument = models.CharField(max_length=100)
class Album(models.Model):
artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
release_date = models.DateField()
num_stars = models.IntegerField()
- 위에서는 Musician의 ForeignKey필드 이름으로 artist를 썼지만 보통 참조되는 모델의 이름(musician)을 lowercase로 적는 게 일반적이다. (단, ForeignKey필드가 여러개일 경우는 다르게 적는다.)
Field options
각 필드는 필드마다 필드 고유의 arguments set이 존재한다. 예를들어, CharField
는 DB의 VARCHAR
필드의 사이즈가 명시된 max_length
인자가 필수적으로 요구된다. 모델 필드 레퍼런스에서 각 필드들의 고유 arguments set을 확인 할 수 있다.
null Defulat값은 False. True면 빈 값을 DB에 NULL로 저장한다.
blank Defulat값은 False. True이면 필드를 비워 둘 수 있다.
null과 blank는 헷갈릴 수 있지만 엄연히 다르다. null
은 순전히 DB와 관련이 있지만 blank
는 유효성 검사와 관련이 있다. 필드 옵션이 blank = True면 form 유효성 검사에서 빈 값을 입력 할 수 있다. 필드에 blank = False가 있으면 필수적으로 필드값을 적어야한다.
choices
choice옵션은 이중 튜플로 구성된다. 첫번째 요소는 DB에 저장되어지는 필드값이고 두번째 요소는 기본 양식 위젯
또는 ModelChoiceField에 표시된다.
장고에서는 html 입력 요소를 widget(위젯)이라고 부른다.
from django.db import models
class Person(models.Model):
SHIRT_SIZES = (
('S', 'Small'),
('M', 'Medium'),
('L', 'Large'),
)
name = models.CharField(max_length=60)
shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
두 번째 요소를 출력해보자.
>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'
default
필드의 기본 값.
help_text
form 위젯과 함께 표시되는 추가 “도움말”텍스트. 이 필드는 form에 사용되지 않아도 문서화에 유용하다.
primary_key
True면 해당 필드가 primary_key가 된다.
from django.db import models
class Fruit(models.Model):
name = models.CharField(max_length=100, primary_key=True)
>>> fruit = Fruit.objects.create(name='Apple')
>>> fruit.name = 'Pear'
>>> fruit.save()
>>> Fruit.objects.values_list('name', flat=True)
<QuerySet ['Apple', 'Pear']>
Automatic primary key fields
따로 필드에 옵션을 부여하지 않으면 기본적으로 id필드가 자동으로 생성되고 primary_key가 된다.
id = models.AutoField(primary_key=True)
unique
True면, 테이블에서 유일해야 한다.
자세하게 알고싶다면 공통된 모델 필드 옵션 레퍼런스에서 추가적으로 확인하자.
Verbose field names
ForeignKey, ManyToManyField, OneToOneFIeld를 제외한 각 필드 유형은 첫번째 선택 인자인 verbose name
을 옵션으로 갖는다. verbose name을 지정하지 않으면 default값으로 필드의 속성 이름을 사용한다.
first_name = models.CharField("person's first name", max_length=30)
ForeignKey, ManyToManyField 및 OneToOneField에는 첫 번째 인자가 모델 클래스가 되어야하므로 verbose_name 키워드 인자를 사용하자.
poll = models.ForeignKey(
Poll,
on_delete=models.CASCADE,
verbose_name="the related poll",
)
sites = models.ManyToManyField(Site, verbose_name="list of sites")
place = models.OneToOneField(
Place,
on_delete=models.CASCADE,
verbose_name="related place",
)
- verbose_name의 첫글자는 소문자를 사용한다.(규약)