Model
참고
1. 배울 순서
- Model이란?
- 만드는 순서
- 실습(블로그에 Lotto 모델 넣기)
- 데이터베이스에 Model을 위한 테이블만들기
2. Model이란?
장고의 모델은 각 모델의 App안에 기본적으로 생성되는 models.py 모듈 안에 정의됩니다. models.py 모듈 안에 하나 이상의 모델 클래스를 정의할 수 있으며, 하나의 모델 클래스는 데이터베이스에서 하나의 테이블에 해당됩니다. 즉, 모델은 데이터 베이스에 영구적으로 데이터를 저장하거나 데이터 베이스로부터 데이터를 불러오는 역할을 합니다.
3. 만드는 순서
모델은 다음과 같은 과정을 거쳐 사이트에 적용됩니다.
- modol.py 에서 원하는 모델 클래스를 작성.
- 만든 클래스를 migarte를 통해 DB(데이터베이스)에 알림.
- admin site 에 모델을 등록.
4. 실습
그럼 이제 실습 예제를 통해 모델을 실제로 적용해보도록 하겠습니다. 우선 아래의 예제를 model.py/myblog 에 복사해서 붙여넣기 해주세요.
예제)
from django.db import models
from django.utils import timezone
import random
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
class GuessNumbers(models.Model): #슈퍼클래스 models의 하위클래스 Model을 상속받는다.
def validate_lotto(value):
if value < 5:
raise ValidationError(
_('%(value)s has to be equal or over 5'),
params={'value': value},
) # 5 미만의 숫자 입력시, 오류가 발생하는 함수 정의
name = models.CharField(max_length = 24) # name이라는 이름의 필드 작성
lottos = models.CharField(max_length = 255, default = '[1, 2, 3, 4, 5, 6]') # lottos는 숫자 조합을 넣는 필드, 기본값(default) 설정.
text = models.CharField(max_length = 255) # 한줄 메모장으로 사용하기 위해 설정, 최대 글자수 255로 제한.
num_lotto = models.IntegerField(validators=[validate_lotto]) # 앞에서 정의한 validate_lotto를 받아서 입력.
update_date = models.DateTimeField() # 업데이트 된 날짜 입력.
# 메소드 정의
def generate(self):
self.lottos = ""
origin = list(range(1,46)) #[1, 2, 3.....44, 45]
for _ in range(0, self.num_lotto): # self.num_lotto 수만큼 반복해서 아래를 수행한다.
random.shuffle(origin) # origin 리스트 순서를 섞는다.
guess = origin[:6] #index번호 0부터 5 까지를 뽑아낸다.
guess.sort()
self.lottos += str(guess) + '\n' # \n은 줄바꿈
self.update_date = timezone.now() # 현재시간 입력
self.save() # 오브젝트를 db에 저장
def __str__(self):
return '%s - %s' % (self.name, self.text)
# __str__ 메서드를 삽입한 이유는 이 메서드가 없으면 장고의 기본이름이 입력되기 때문입니다.
제가 초짜라 하나씩 이해하는데 시간이 꽤 걸렸네요..
위의 # 뒤에 설명을 적어두었습니다! 차근차근 설명하겠습니다.
4. 데이터베이스에 Model을 위한 테이블 만들기 이제 만든 예제를 DB에 알리고 admin site에 등록하면 완성입니다!
admin.py/myblog 에 앞서 만든 클래스를 넣으세요.
from mylotto.models import GuessNumbers
admin.site.register(GuessNumbers)
그리고, 터미널 창에 아래의 명령들을 입력해주세요.
python manage.py makemigartions - migrate를 준비시키는 명령.
python manage.py migrate - migrate를 실제로 수행하는 명령.
python manage.py runserver - 웹서버 실행.
자, 이제 저희가 만든 모델을 확인해볼까요?
5. 실습
다들 취미가 뭔가요?
채연 - 애니
기완(전 그마 출신), 요섭 - 게임(오버워치)
도형 - 배드민턴
윤지 - 웹툰
현지 - 독서
이중 가장 많은 투표를 받은 ‘게임’을 주제로 게임 질문 게시판에 필요한 모델을 함께 만들었습니다.
class Question(models.Model) :
game = (
("오버워치", "옵치" ),
("배틀그라운", "배그"),
("하스스톤", "하스스톤"),
("히어로즈오브스톰", "히오스"),
)
title = models.CharField(max_length=100)
writer = models.CharField(max_length=15)
category = models.CharField(max_length=10 ,choices=game, default="오버워치")
content = models.TextField()
password = models.CharField(max_length=10)
image = models.ImageField(verbose_name="이미지")
created_date = models.DateTimeField(auto_now_add=True) #편집 불가능, 자동 생성
updated_date = models.DateTimeField(auto_now=True) #자동 생성
def __str__(self) :
return "%s - %s" %(self.title, self.writer)
오늘 배운 내용을 토대로 각자 취미에 맞는 모델을 한 번 만들어볼까요?