AI웹 개발자 과정 공부 (팀스파르타)/Django (장고)

24.04.19_TIL (1) (Django Model & ORM & CRUD)

티아(tia) 2024. 4. 19. 21:09
728x90

 

 

++ 장고 공식 문서는 항상 확인하기 

https://docs.djangoproject.com/

 

 

++ 파이썬 가상환경 실행 끄려면 ctrl + c 누르면 꺼지고 터미널 화면이 돌아옴

 

 

 

 

 

 

1.  기본 개념 

 

  • Model
    • 저장할 데이터에 대한 필드와 동작들을 포함한 데이터베이스 구조 (layout)
    • 데이터 베이스는 잘 정리된 데이터가 모여있는 것
    • 쿼리 : 데이터베이스를 조작할 수 있는 언어
    • 스키마 : 데이터베이스의 구조, 관계 등을 정의한 것! (명세서)

사용자 (Users)

  • 사용자 ID (User_ID) - 정수 (Integer)
  • 이름 (Name) - 문자열 (String)
  • 이메일 (Email) - 문자열 (String)
  • 주소 (Address) - 문자열 (String)

책 (Books)

  • 책 ID (Book_ID) - 정수 (Integer)
  • 제목 (Title) - 문자열 (String)
  • 저자 (Author) - 문자열 (String)
  • 출판사 (Publisher) - 문자열 (String)
  • 가격 (Price) - 부동 소수점 (Float)

주문 (Orders)

  • 주문 ID (Order_ID) - 정수 (Integer)
  • 사용자 ID (User_ID) - 정수 (Integer)
  • 책 ID (Book_ID) - 정수 (Integer)
  • 주문일 (Order_Date) - 날짜/시간 (Date/Time)
  • 수량 (Quantity) - 정수 (Integer)

 

 

 

 

2.  Model 작성하기

  •  기본 모델 형태
from django.db import models

# Create your models here.
class Article(models.Model):
  pass

 

from django.db import models

# Create your models here.
class Article(models.Model):
  title = models.CharField(max_length=50)
  content = models.TextField()

 

  •  위 코드로 작성하면 아래의 그림처럼 데이터베이스의 열을 만들 수 있다. 행은 데이터를 넣어서 채울 수 있음. 

 

 

 

 

 

 

 

 

 

3.  Migration 해주기

 

  •  마이그레이션이 장고에게 파이썬의 데이터베이스를 적용, 반영해달라고 하는 명령어 같은 것

⭐ model에 생긴 변경사항을 마이그레이션으로 만드는 과정

  • [코드스니펫] 마이그레이션 생성
python manage.py makemigrations

 

⭐ 마이그레이션을 실제로 데이터에 반영해서 동기화 하는 과정

  • [코드스니펫] 반영되지 않은 마이그레이션 반영 
python manage.py migrate

 

 

  •  마이그레이션 생성을 하면 위의 그림처럼 생기는 것을 볼 수 있음
  • id 를 FK 로 가질 수 있다

 

 

  • control + shift + p (맥은 command)를 눌러서 ‘SQLite: Open Database’ 선택
  • 내가 열고 싶은 데이터베이스 파일을 선택 - db.sqlite3/~ 파일이름 되어있는 것 선택
  • 파일명들 아래에 보면 sqlite Explorer 이 생기면서 데이터베이스가 들어갈 수 있는 곳이 생긴다.

 

 

 

 

 

 

 

 

 

4.  많이 쓰는 필드

from django.db import models

# Create your models here.
class Article(models.Model):
  title = models.CharField(max_length=50)
  content = models.TextField()
  created_at = models.DateTimeField(auto_now_add=True) #최초추가
  updated_at = models.DateTimeField(auto_now=True) #수정될때마다

 

⇒ 기존에 생성한 데이터들은 어떻게 하겠냐고 묻습니다.

  1. 값하나를 주면 그 값을 다 넣는 방식
  2. 일단 종료하고 model로 돌아가서 기본값 설정하는 방식

1번 선택

→ 값을 따로 입력하지 않아도 Enter만 치면 지금 시간을 계산해서 넣어주거나 아니면 값을 따로 입력하라고 합니다.

 

 

 

 

  •  등록해주고 새로고침을 해주면 2개의 컬럼이 생긴것을 볼 수 있다.

 

 

 

 

 

 

5.  ORM Shell 설치하기

  • Object-Relational-Mapping  객체 … 관계형 … 맵핑 : 데이터베이스를 조작할 수 있게 해준다.
  • Database API

MyModel.objects.all()

  • Model Class . Manager . QuerysetAPI
  • CRUD with Shell

 

  •  우리가 파이썬을 실행할 때에는 python 만 입력하면 되는데 django 는 다른 환경으로 접근해야한다.
python manage.py shell

 

 

  •  실행했을 때 여러 명령어를 직접 다 입력해야하기 때문에 불편하다.!
  • 나갈 때는 exit() 라고 누르고 나간다
  • 편한 패키지를 설치해야함
pip install django-extensions
pip install ipython

 

 

  •  설치 다하고 프리즈 해주기
pip freeze > requirements.txt

 

 

  • settings.py 앱 등록
"django_extensions,"

 

 

 

  •  설치를 끝내고 실행해보자.
python manage.py shell_plus

 

 

 

 

 

 

 

 

 

 

6.  CRUD 만들기

  • 하나의 Article 생성하기
article = Article()
article.title = 'first_title'
article.content = 'my_content'

# 여기에서 전체 Article을 조회해보면
Article.objects.all() # 비어있다

# save()하기전에는 저장되지 않음
article.save()  
# 저장한 뒤에 다시 조회하면 <QuerySet [<Article: Article object (1)>]> 하고 하나가 조회된다.

# 다시 전체 Article을 조회해보면 하나의 아티클이 있음
Article.objects.all()


# 속성 하나씩 접근하기
# 제목 
article.title

# 내용
article.content

# 생성일시
article.create_at

# pk(id)
article.id

 

 

 

  • 매니저를 이용하면 저장하지 않아도 자동으로 저장되는 것을 볼 수 있다.

 

 

  •  파이썬의 매직매서드를 사용해서 형태를 바꾸어줄 수 있다. 조회하면 제목이 나올 수 있게
def __str__(self):
        return self.title

 

 

 

 

  •  모두 조회하기 :  Article.objects.all()
  • 하나만 조회하기 : Article.objects.get(id=1)
    • 딱 1개의 조회가 필요할 때 사용합니다.
    • 조건에 해당하는 객체가 없다면 DoesNotExist 예외를 발생시킴 (터진다는 소리)
    • 한 개 이상의 객체가 리턴될 경우도 MulipleObjectReturned 예외를 발생시킴 (터진다는 소리) - 같은 이름의 존재가 있으면 터짐
  •  조건으로 조회하기  :  Article.objects.filter(content='my_content')
Article.objects.filter(id__gt=2) # 2보다 큰 id
Article.objects.filter(id__in=[1,2,3]) # 1,2,3에 속하는 id
Article.objects.filter(content__contains='my') # content에 'my'가 포함된

 

 

 

 

 

  •  수정하기
article = Article.object.get(id=1)
article.title = 'updated title'
article.save()

 

 

 

  •  삭제하기
article = Article.objects.get(id=2)
article.delete()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형