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의 첫글자는 소문자를 사용한다.(규약)






siwon

$_$