Model

Model



참고

  1. 장고 모델
  2. lotto - model class 만들기
  3. MODEL 클래스 만들기, admin site 에 Model 등록
  4. Django 모델 (Model)

1. 배울 순서

  • Model이란?
  • 만드는 순서
  • 실습(블로그에 Lotto 모델 넣기)
  • 데이터베이스에 Model을 위한 테이블만들기


2. Model이란?

장고의 모델은 각 모델의 App안에 기본적으로 생성되는 models.py 모듈 안에 정의됩니다. models.py 모듈 안에 하나 이상의 모델 클래스를 정의할 수 있으며, 하나의 모델 클래스는 데이터베이스에서 하나의 테이블에 해당됩니다. 즉, 모델은 데이터 베이스에 영구적으로 데이터를 저장하거나 데이터 베이스로부터 데이터를 불러오는 역할을 합니다.



3. 만드는 순서

모델은 다음과 같은 과정을 거쳐 사이트에 적용됩니다.

  1. modol.py 에서 원하는 모델 클래스를 작성.
  2. 만든 클래스를 migarte를 통해 DB(데이터베이스)에 알림.
  3. 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)


오늘 배운 내용을 토대로 각자 취미에 맞는 모델을 한 번 만들어볼까요?