DataBase, Model, Shell

승훈·2022년 11월 4일
0

Django 기초

목록 보기
4/10

DataBase 설치

💡 학습목표 : 웹의 백그라운드에서 사용될 데이터베이스를 연결하고 사용해본다.
  1. 프로젝트 내의 Setting.py에서 사용할 데이터베이스를 설정할 수 있다.

    # /workspace/MJ/mysite/mysite/settings.py
    ...
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3', # 이 부분을 변경
            'NAME': BASE_DIR / 'db.sqlite3',
        }
    }
    ...
    • ‘django.db.backend.mysql’ / ‘django.db.backend.oracle’ 등 다양한 데이터베이스 서비스를 연결해서 사용 가능하다.

Model 만들기

  1. INSTALLED_APPS에 각각의 기능들을 앱으로 만들어 추가할 수 있다.

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
  2. 이 APPS들 중 몇몇은 기본적으로 하나이상의 데이터베이스 테이블을 사용하는데 이 기능을 사용하기 위해 테이블을 아래 명령어를 통해 미리 만들어야 한다.

    $ python manage.py migrate
  3. 이제 모델을 정의한다. 모델이란 데이터베이스의 레이아웃이라고 보면 된다. 단순한 설문조사 앱을 만드는 것이기 때문에 Qusetion과 Choice 두가지 모델을 생성해본다. Question은 질문(Question)과 발행일 (Publication date), 2개의 필드를 가지게 되며 Choice는 선택지(Choice)와 표(Vote)계산을 위한 두개의 필드를 가지게 되고 두 모델은 연관(Associated)된다.

    # /workspace/MJ/polls/models.py
    
    from django.db import models
    
    class Question(models.Model):
        question_text = models.CharField(max_length=200)
        pub_date = models.DateTimeField('date published')
    		# 필드이름 = models.필드의 데이터 형식 지정
    
    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)

Model 활성화

  1. Django는 앱을 Settings.py에 등록을 해야만 사용 가능하다.

    # /workspace/MJ/mysite/mysite/settings.py
    
    INSTALLED_APPS = [
        'polls.apps.PollsConfig', # 요 문구를 추가하면 된다.
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]
    • Polls 앱 안의 apps.py 안의 PollsConfig 라는 앱을 등록한다고 선언
  2. makemigration 명령을 실행한다. 이 명령은 만든 모델들을 Migration이라는 장소의 데이터 베이스내에 저장할 수 있도록 등록해주는 기능이다.

    /workspace/Edu_02/mysite > python manage.py makemigrations polls
    • 성공적으로 끝나면 polls/migrations/ 경로안에 0001_initial.py가 생성된것을 확인할 수 있다. 이 파일안에 DB안에 테이블을 생성하기위한 설계도 이다.
  3. migrate명령어를 이용해 설정을 완료해준다.

    /workspace/Edu_02/mysite > python manage.py migrate

API 가지고 놀기

💡 API란? : 개발자가 필요로하는 데이터를 뽑아내거나 입력할 수 있도록 만들어 놓은 함수
/workspace/Edu_02/mysite > python manage.py shell
  1. Shell 모드 진입 후 아래 명령어로 Choice와 Question을 사용하겠다고 추가해준다.

    In[1] : from polls.models import Choice, Question # 추가
    
    In[2] : Question.objects.all() # Question안의 모든 명령어를 호출
    Out[2]: <QuerySet []> # 아직 등록한 명령이 없어 빈 리스트를 반환
  2. Shell 모드를 이용해 Question내에 명령어를 만든다.

    In [3]: from django.utils import timezone # 사용할 라이브러리 추가
    
    In [4]: q = Question(question_text="What's new?", pub_date=timezone.now
       ...: ()) # 명령어를 작성한다.
    
    In [5]: q.save() # 만든 명령을 저장한다.
    
    In [6]: q.id
    Out[6]: 1 # id의 경우 따로 지정않더라도 장고에서 알아서 부여해준다.
    
    In [7]: q.question_text # 위에서 만든 명령어가 정상작동하는지 확인.
    Out[7]: "What's new?"
    
    In [8]: q.pub_date # 마찬가지로 timezone도 정상적으로 들어간 것을 확인.
    Out[8]: datetime.datetime(2022, 11, 4, 8, 19, 6, 478161, tzinfo=<UTC>)
  3. 작성한 명령어의 내용을 바꿀수도 있다.

    In [9] : q.question_text = "What's Up?"
    In [10] : q.save()
  4. models.py 안의 def 를 추가하여 다양한 메소드를 추가할 수 있고 커스텀 메소드도 만들어 필요로 하는 다양한 메소드를 넣을 수 있다.

    # /workspace/Edu_02/mysite/polls/models.py
    
    import datetime
    from django.db import models
    from django.utils import timezone
    
    # Create your models here.
    class Question(models.Model):
    	question_text = models.CharField(max_length=200)
    	pub_date = models.DateTimeField('date published')
        
    	def __str__(self): # 위에서 시도했던 메소드
    		return self.question_text
        
    	def was_published_recently(self): # 사용자 커스텀 메소드
    		return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    
    class Choice(models.Model):
        question = models.ForeignKey(Question, on_delete=models.CASCADE)
        choice_text = models.CharField(max_length=200)
        votes = models.IntegerField(default=0)
        
        def __str__(self): # 위에서 시도했던 메소드
            return self.choice_text
    In [1]: from polls.models import Choice,Question
    # 다시 접속하 경우 polls 폴더 안의 models.py에서 Choice와 Question을 불러온다.
    In [2]: Question.objects.all()
    Out[2]: <QuerySet [<Question: What's new?>]> 
    # 아까는 1이 나왔지만 지금은 정상적으로 질문이 나온다.
    • 다양한 기능을 지원함으로 필요한 기능은 찾아서 배우면 된다. 다 외우는 사람 없다.

0개의 댓글

관련 채용 정보