App 생성

$ django-admin startapp Polls

생성된 app을 django에 등록하기 위해서는 setting.py에 INSTALLED_APPS에 추가시켜줘야 함

# Polls/apps.py

from django.apps import AppConfig

class PollsConfig(AppConfig):
    name = 'Polls'
# setting.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

INSTALLED_APPS += [
    'polls.apps.PollsConfig'
]

Model

# Polls/models.py

from django.db import models
from django.core.validators import MinLengthValidator

class Question(models.Model):
    CATEGORY_CHOICE=(
        (1, '일상'),
        (2, '학습'),
        (3, '취미'),    
    )
    
    SECRET_CHOICE=(
        (False, '공개'),
        (True, '비공개'),
    )
    
    title_validator = MinLengthValidator(20, "길이가 너무 짧습니다.")

    writer = models.ForeignKey(Writer, on_delete=models.CASCADE)
    category = models.IntegerField(choices=CATEGORY_CHOICE, verbose_name='카테고리')
    title = models.CharField(max_length=20, verbose_name='제목', validator=[title_validator])
    content = models.TextField()
    pub_date = models.DateTimeField(default=timezone.now)
    secret = models.BooleanField(default = False, choices=SECRET_CHOICE, verbose_name='공개여부')
    
    class Meta:
        db_table = 'question'		# 테이블명
    
    def __str__(self):			# toSring()과 같음
        return self.title

○ Model 필드 파라미터 (Form 필드 파라미터와 유사)

 - max_length : 최대글자수

 - null : Null값 허용 (d : False)

 - unique: Unique값 (d : False)

 - blank : 유호성 검사시 공백 허용 (d : False)

 - default : 디폴트값

 - verbose_name : 변수명을 오버라이딩할 이름

 - choices : select box를 사용

 - validators : 유효성검사 (유효성 검사는 Model에서 하는걸 추천)

  • DateField, DateTimeField, TimeField

 - auto_now : 수정할때마다 현재시간로 갱신 (d : False)

 - auto_now_add : 삽입시 현재시간 입력 (d : False)

  • OneToOneField, ForeignKey, ManyToManyField

 - on_delete : 삭제시 관계를 맺은 모델의 데이터 처리방법 (models.CASCADE, PROTECT, RESTRICT, SET_NULL, SET_DEFAULT, SET(), DO_NOTHING)

  [SET_NULL -> null=True옵션이 있어야만 가능 / SET_DEFAULT -> default=True옵션이 있어야만 가능]

 - related_name : 역참조 관계시 호출할 이름 설정 (modelname_set 대신 사용할 이름)

 - limit_choices_to (dictionary 형태) : 관계를 맺은 모델의 해당 필드값으로 입력제한 (콤보상자)


migration(링크)

migration 명령어를 사용하여 새로운 Model을 django에게 알려줘야 함.

 - makemigrations : 새로운 migration 생성

 - migrate : migration을 django에 적용 (테이블 생성)

$ python manage.py makemigrations polls
$ python manage.py migrate polls

docs.djangoproject.com/en/3.1/ref/models/fields/