[웹프로그래밍 기초] Django를 이용한 데이터베이스(DB) 구축하기

2020. 6. 10. 17:49노트/Django : 웹

새로운 가상환경 생성

  • Django > orm이라는 새로운 폴더 생성

  • python -m venv venv 명령어로 새로운 가상환경 만들어주기

  • 가상환경 실행 

  • pip install django==2.2.13 으로 장고 설정

  • TERMINAL에 django-admin startproject orm . 로 orm 폴더 생성
  • TERMINAL에 python manage.py runserver 로 서버 생성
        settings.py 에서 LANGUAGE_CODE = 'ko-kr' , TIME_ZONE = 'Asia/Seoul'로 변경
  • TERMINAL에 python manage.py startapp articles 라는 명령어로 App 생성
        settings.py 에서 INSTALLED_APPS = 'articles', 추가

 

App

  • VSCode 하나 더 열어서 새로운 Python 파일 생성
        TIL > Web_python이라는 새로운 폴더 생성 > VSCode로 열어서 폴더에 person.py파일 생성
class Person(): # 클래스
    name = '사람의 고유한 속성' # 클래스 변수
    age = '출생 이후부터 삶을 마감할 때까지의 기간'

    # instance가 행할 행위(메소드)
    def greeting(self):
        print(f'{self.name}이 인사합니다. 안녕하세요.')

    def eating(self):
        print(f'{self.name}은 밥을 먹습니다.')

    def aging(self):
        print(f'{self.name}은 {self.age}살이지만, 나이를 먹어가는 중입니다.')

# 클래스 - 사람(집단, 특성)
# 인스턴스 - 사람(개인)
# 메소드 - 사람(개인)이 가지고 있는 행위
# 클래스 변수 - 사람(집단, 특성)이 가지고 있는 공통 속성
# 인스턴스 변수 - 사람(개인)이 가지는 고유한 특성


# 인스턴트 생성
nayeon = Person() # 인스턴트
print(nayeon.name) # 인스턴트 변수 => 사람의 고유한 속성
print(nayeon.age) #=> 출생 이후부터 삶을 마감할 때까지의 기간

nayeon.name = '나연' # 인스턴트 변수에 값을 할당
nayeon.age = '27'
print(nayeon.name) #=> 나연
print(nayeon.age) #=> 27

print(Person.name) #=> 사람의 고유한 속성
print(Person.age) #=> 출생 이후부터 삶을 마감할 때까지의 기간

nayeon.eating() #=> 나연은 밥을 먹습니다

justin = Person()
print(justin.name) #=> 사람의 고유한 속성
justin.name = '재석'
print(justin.name) #=> 재석
print(nayeon.name) #=> 나연

# DB - Class
# 테이블 - 클래스
# 열(column) - 클래스 변수
# 행(row) - 인스턴스
# 행이 가지는 값들 - 인스턴스 변수
# 값들의 조합 or 가공 - 메소드 역할

  • orm VSCode로 돌아와서 model 정의
        articles > models.py에서 DB 스키마 설계도 정의해주는 것

1. models.py 작성 및 변경(생성 및 수정)

2. python manage.py makemigrations

   -> migration(설계도) 파일 생성

3. python manage.py migrate

   -> 실제 Database에 적용 (테이블 생성)

from django.db import models

# Create your models here.
# 데이터베이스 테이블 생성
class Article(models.Model): 
    # models.Model는 Django가 만들어놓은 기능으로 DB와 연동 가능하게 해줌
    # id = models.AutoField(primary_key=True) - Model에서 알아서 생성해줘서 생략
    title = models.CharField(max_length=100) # CharField는 길이제한 가지는 필드
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True) # 날짜, 시간 저장하는 필드

 

[Django Shell]

 

python manage.py shell

0. Model import 

 

from articles.models import Article

 

1. Create 

1-1. 첫번째 

 

article = Article()
article.title = 'First'
article.content = 'Wow!'
article.save()

 

1-2. 두번째 

 

article = Article(title='Second', content='two')
article.save()

 

1-3. 세번째 

 

article = Article.objects.create( title = 'Third' , content = 'three')

 

2. Read 

2-1. all() -> SELECT *  # 복수 (0~여러개) (리스트)

 

articles = Article.objects.all()

 

2-2. filter() -> WHERE  # 복수 (0~여러개) (리스트)

 

articles = Article.objects.filter(title='First')

 

2-3. get() # 단수(1개) (인스턴스) 무조건 1개만 리턴 필수 

 

article = Article.objects.get(id=1)
article = Article.objects.get(pk=1) # id__exact 
article = Article.objects.get(title='First')
article = Article.objects.get(pk=10) #Error
article = Article.objects.filter(pk=10) # []

 

2-4. Queryset (유사 리스트)

 

articles = Article.objects.all() # 복수 
articles[0] # 첫번째 데이터  # -> 단수 
articles.first() # 첫번째 데이터 
articles[-1] # 마지막 데이터 
articles.last() # 마지막 데이터 
articles[1:3] # 2번째 ~ 3번째 데이터 

(OFFSET 1, LIMIT 2)OFFSET , LIMIT 
articles[OFFSET:OFFSET+LIMIT]

 

2-5. order_by()

 

article = Article.objects.order_by('created_at') # 오름차순 
article = Article.objects.order_by('-created_at') # 내림차순 

 

3. Update 

(1) 데이터 가져오기 (<-from DB)

 

article = Article.objects.get(pk=1)

(2) 인스턴스 수정 (only Python)

 

article.content = 'Bye bye!'

(3) 인스턴스 저장 (->to DB)

 

article.save() 

 

4. Delete 

(1) 데이터 가져오기(<-DB)

 

article = Article.objects.get(pk=1)

(2) 인스턴스 삭제(-> DB)

 

article.delete()

'''

 

admin.py 설정 

 

from django.contrib import admin 
from .models import Article 

class ArticleAdmin(admin.ModelAdmin):
    list_display = ['id', 'title', 'created_at']

# Register your models here.
admin.site.register(Article, ArticleAdmin) 

urls.py 설정 

 

from django.contrib import admin 
from django.urls import path 

url patterns = [ 
    path('admin/' , admin.site.urls), 
]