모델 추가

Posted on 2021-08-25 by GKSRUDTN99
Django로 웹사이트 만들기 장고

모델이란?

데이터를 저장하기 위한 하나의 단위
복잡한 SQL문 없이 파이썬만으로 CRUD 기능을 구현할 수 있다.

모델 만들기

우선 startapp 명령어를 이용해 앱을 만든 뒤, 앱의 models.py에 다음과 같이 작성한다.

from django.db import models

# 클래스의 매개변수로 'models.Model'을 적는 것은, 
# Post 클래스가 models 모듈의 Model 클래스를 확장하여 만든 파이썬 클래스 임을 표시함.

class Post(models.Model):
    title = models.Charfield(max_length=30)
    content = models.TextField()

    created_at = models.DateTimeField()
    # author : 추후 작성 예정

위와 같이 작성한 뒤, python manage.py makemigrations를 통해 마이그레이션을 생성한다.
정상적으로 마이그레이션이 생성되었다면 python manage.py migrate를 통해 실제 db에 모델을 적용한다.

settings.py파일에 앱을 등록해야 정상적으로 동작한다!
.gitignoremigrations도 추가한다

admin 페이지에 Post 모델 추가하기

앱 이름/admin.py에 다음 내용을 추가합니다.

from django.contrib import admin
from .models import Post

admin.site.register(Post)

admin 페이지에 __str__()함수로 포스트 제목과 번호 보여주기

Post 모델을 다음과 같이 수정한다.

class Post(models.Model):
    title = models.Charfield(max_length=30)
    content = models.TextField()

    created_at = models.DateTimeField()
    def __str__(self):
        return f'[{self.pk}]{self.title}

python의 f String은 문자열 안에 변수를 표시하기 편하게 하는 format String이다.

장고 프로젝트의 기준 시간 바꾸기

  1. settings.py 파일을 연다
  2. TIME_ZONE = 'UTC'를 'Asia/Seoul'로 수정한다.
  3. USE_TZ 는 False로 설정한다.

DateTime의 auto_now_addauto_now 활용하기

DateTimeField에는 auto_nowauto_now_add 설정이 있다.
auto_now_add는 처음 레코드가 생성될 때, 현재 시간을 저장하도록 하는 설정이다.
auto_now는 레코드가 생성되고 수정될 때 마다 현재 시간을 저장하도록 한다.
created_at은 auto_now_add로, updated_at은 auto_now 설정을 사용한다.

class Post(models.Model):
    title = models.Charfield(max_length=30)
    content = models.TextField()

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    def __str__(self):
        return f'[{self.pk}]{self.title}

위의 코드들을 입력한뒤, makemigrationsmigrate를 수행한다.

장고 셸 사용하기

laravel의 tinker처럼 장고도 터미널에서 간단한 명령들을 테스트 해볼 수 있는 환경이 있다.
python manage.py shell로 실행한다.
테스트로 다음과 같은 명령들을 실행해본다.

>>> from blog.models import Post
>>> p = Post.objects.last()
>>> p.title
>>> p.created_at
>>> p.updated_at
>>> exit()