nul-problog

[Django/장고 tutorial 2] 데이터베이스(model 생성, API 사용) 본문

Django

[Django/장고 tutorial 2] 데이터베이스(model 생성, API 사용)

enjoy_nul 2022. 11. 16. 11:07

앱 생성하는 법

https://nul-problg.tistory.com/38

 

[Django/장고 tutorial 1] 장고 app(app 생성, 서버 구동)

시작하기전! 우선 해야하는 것은 1. python 설치 https://www.python.org/ Welcome to Python.org The official home of the Python Programming Language www.python.org 2. 장고 설치하기 장고를 설치하는 방법에는 여러가지가 있지

nul-problg.tistory.com

 

https://docs.djangoproject.com/en/2.2/intro/tutorial02/

참고하여 진행

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

데이터베이스 설정

 

데이터베이스 종류는 오라클 , PostgreSQL등 많지만 경량 데이터베이스인 SQLite 를 가장 많이 사용

말이 경량 데이터베이스일 뿐 프로젝트를 진행하는 것에 있어 문제가 없음

 

만약 데이터베이스를 변경하고자 한다면 mysite/settings.py 에서 데이터베이스 종류를 변경 가능

 

'ENGINE':

'django.db.backends.sqlite3', 'django.db.backends.postgresql', 'django.db.backends.mysql', 'django.db.backends.oracle'

 

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',  # 데이터 베이스 기본적으로 sqlLite 를 많이 사용함. 다른 백엔드를 사용하려면 이곳에서 변경 
        'NAME': BASE_DIR / 'db.sqlite3', #데이터베이스의 이름. SQL Lite를 사용하는 경우 데이터베이스는  컴퓨터의 파일이 됨
    }
}

mysite/settings.py  에서 INSTALLES_APPS은 장고 인스턴스에서 활성화된 장고 애플리케이션의 이름들 , 이러한 앱들을 사용하겠다는 것을 의미

 

- 장고에서 기본적으로 제공하는 어플리케이션

NSTALLED_APPS = [
    'django.contrib.admin', # 관리 사이트
    'django.contrib.auth', # 인증 시스템 
    'django.contrib.contenttypes', # 콘텐츠 유형에 대한 프레임워크
    'django.contrib.sessions', # 세션 프레임워크
    'django.contrib.messages', # 메시지 프레임워크
    'django.contrib.staticfiles', # 정적 파일 관리를 위한 프레임워크
]

 

기본적으로 제공하는 어플리케이션들은 최소한 하나 이상의 데이터베이스들을 사용

따라서 데이터베이스 테이블을 미리 만들 필요가 있기 때문에 migrate 명령어를 실행

 

$ python manage.py migrate

 

모델 만들기

 

장고에서 말하는 model 이란 데이터베이스의 구조(layout)을 말함

 

- polls앱에 필요한 Question, Choice 모델 생성.

polls.models.py

from django.db import models

#두개의 데이터베이스를 만듦 Question,Choice

class Question(models.Model):
    question_text = models.CharField(max_length=200) #질문내용 ,문자필드
    pub_date = models.DateTimeField('date published') #생성날짜 , 날짜/시간 필드


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE) #선택지에 해당하는 질문, ForeignKey외래키 Question내를 가리킴 
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0) #표 수

생성한 모델 Question, Choice 을 활성화 시키도록함

 

모델 활성화

 

mysite/settings.py 의 INSTALLES_APPS에 polls앱을 추가해야함

INSTALLED_APPS = [
    'polls.apps.PollsConfig', # 만든 polls 앱 PollsConfig 등록하기 
    
    'django.contrib.admin', # 관리 사이트
    'django.contrib.auth', # 인증 시스템 
    'django.contrib.contenttypes', # 콘텐츠 유형에 대한 프레임워크
    'django.contrib.sessions', # 세션 프레임워크
    'django.contrib.messages', # 메시지 프레임워크
    'django.contrib.staticfiles', # 정적 파일 관리를 위한 프레임워크
]

이를 통해 장고는 polls 앱이 포함되었다는 것을 알 수있게 됨

 

makemigration 명령어는 우리가 작성한 모델을 migration이라는 장소에 데이터베이스내의 테이블을 생성할수 있도록 설계도를 만드는 작업을 하는 것이라고 생각하면됨

 

명령어를 입력하면,

$ python manage.py makemigrations polls

아래와 같은 결과가 나온다.

Migrations for 'polls':
  polls/migrations/0001_initial.py
    - Create model Question
    - Create model Choice

 

데이터베이스 내의 테이블을 생성하기 위한 설계도가 만들어진 것을 확인

 

migrate 명령어를 통해 데이터베이스 내의 실제 테이블을 생성하는 작업을 할 수있다.

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Rendering model states... DONE
  Applying polls.0001_initial... OK

 

데이터베이스 내의 테이블을 생성했으니,Python 쉘을 통해 Django  API를 사용할 수 있다.

 

* API란?

개발자가 필요로하는 데이터를 사용할 수 있도록 만들어놓은 함수 또는 

서버나 데이터베이스에게 데이터를 입력할수 있도록 만들어놓은 함수라고 생각하면 됨

 

- Python 쉘 실행

$ python manage.py shell

 

-  만든 모델(Choice, Question) 을 사용하겠다고 추가 하는 작업

>>> from polls.models import Choice, Question

 

- Question내의 모든 모델을 불러오기 

>>> Question.objects.all()
<QuerySet []>

-> 등록된 데이터가 없기 때문에 빈 내용이 출력

 

 

- Question내의 데이터 생성 

>>> from django.utils import timezone

 

 -> Question 모델에는 질문과 발행일이 있었음. 발행일 시간을 입력학 위해서 timezone 라이브러리를 import

 

 

- Question 데이터 하나 추가

>>> q = Question(question_text="What's new?", pub_date=timezone.now())
>>> q.save()

 

- id 확인 해보기 

>>> q.id
1

-> id 는 모델을 생성할때 사용자가 명시를 하지 않더라도 장고에서 자동으로 만들어 주는 필드 중 하나이다.

 

- 입력한 데이터 확인 (텍스트와 등록일)

>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2022, 11, 15, 6, 48, 27, 869435, tzinfo=<UTC>)

 

- 텍스트 변경

>>> q.question_text = "What's up?"
>>> q.save()

 

- 다시 Question내의 모든 모델을 불러오기 

>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>

- > 입력한 오브젝트가 한개 있음을 확인 

     이러한 방법(objects.all()) 은 어떤 데이터인지 구분이 어려움 

   아래와 같은 방법으로 모델내의 메소드를 사용하면 보고 싶은 문구를 확인 가능

 

- polls.models.py 파일의 Choice, Question 모델에 __str__()메소드 추가

class Question(models.Model):
  
    question_text = models.CharField(max_length=200) #질문내용 ,문자필드
    pub_date = models.DateTimeField('date published') #생성날짜 , 날짜/시간 필드
    
    def __str__(self):
        return self.question_text


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE) #선택지에 해당하는 질문, ForeignKey외래키 Question내를 가리킴 
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0) #표 수
    
    def __str__(self):
        return self.choice_text

 

- 개발자가 필요로 하는 커스텀 메소드 추가

from django.utils import timezone

class Question(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
timezone.now() - datetime.timedelta(days=1)

-> 현재시각 - 하루 전시각 

 

 

- 변경 사항 저장하고 다시 shell을 시작

$ python manage.py shell
>>> from polls.models import Choice, Question

>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>

-> quetion_text 출력

 

 

- '모델클래스.objects.filter()' 를 통해 조건에 맞는 데이터 조회 

>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith='What')
<QuerySet [<Question: What's up?>]>

 

-  현재년도와 등록년도가 동일한 question 텍스트 조회

>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: what's up>

 

 

* timezone 참고문서

https://docs.djangoproject.com/ko/4.1/topics/i18n/timezones/

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

 

데이터베이스 데이터를 장고 admin을 통해서도 확인 가능하다.

다음은 admin~

Comments