-
Django Model, Migration, ORM, Database APIDjango 2024. 8. 16. 03:07
Django는 Model을 이용해서 데이터를 조작한다.
일반적으로 하나의 모델은 하나의 데이터베이스 테이블을 의미한다.
데이터베이스 기본 구조 ↓
User_ID Name Email Address 1 John Doe john@example.com 123 Main St 2 Jane Doe jane@example.com 456 Elm St - 테이블(Table)
- 기본키, PK(Primary Key)
- 열(Column)
- 행(Row)
→ 이러한 데이터베이스를 Model을 사용해서 구조화 하고 조작할 수 있는데, 장고는 파이썬으로 Model 코드를 작성한 후 데이터베이스에 반영하기 위해 마이그레이션을 만들고, 이 단위로 데이터베이스에 변경사항을 반영한다.
Django Model 작성하기
models.py
from django.db import models class Article(models.Model): pass
- models.Model을 상속받아서 사용하고자 하는 데이터 스키마(구조)를 정의한다.
- 모든 모델은 models.Model의 서브 클래스로 표현한다.
필드 추가 (제목 & 내용)
from django.db import models class Article(models.Model): title = models.CharField(max_length=50) content = models.TextField()
공식문서(Django Fields Types)
마이그레이션(Migration)
1. model에 생긴 변경사항을 마이그레이션으로 생성
python manage.py makemigrations
2. 마이그레이션을 실제 데이터에 반영(동기화)
python manage.py migrate
참고)
마이그레이션 목록과 적용여부를 보여주는 명령어
python manage.py showmigration
해당 마이그레이션이 어떤 sql문을 작성했는지 보여주는 명령어
python manage.py sqlmigrate <app_name> <migration_no>
ORM
Object-Relational-Mapping 객체 관계형 맵핑
응? 🫠
간단히 말하면, SQL 안쓰고 Python으로 데이터베이스 조작할 수 있게 해주는걸 말한다.
→ (SQL Statement ↔ ORM ↔ Python Object )
- Django ORM만 있는건 아니고 여러 가지가 존재한다.
- Python - Django ORM, SQLAlchemy, Tortoise ORM …
- JAVA - JPA, Hybernate …
- Node.js - Sequalize …
Database API
장고는 objects라는 이름의 Manager가 있어서 filter(), get(), create(), update() 등과 같은 메서드를 사용하여 데이터베이스 작업을 쉽게 수행할 수 있다.
기본 형태
MyModel.objects.all()
( Model Class . Manager . QuerysetAPI )
↑ 각 자리의 역할
# Create new_article = Article.objects.create(title="First Article", content="This is my first article.") # Read article = Article.objects.get(pk=1) # Update article.title = "Updated Title" article.save() # Delete article.delete()
Django Shell
Django가 제공하는 여러가지 기능을 명령어로 입력해서 실행해볼 수 있는 Shell 환경
1. 패키지 설치하기
pip install django-extensions
2. settings.py 앱 등록
"django_extensions",
📌 django_extensions → 중간에 하이픈(-)이 아닌 언더바(_)
ipython
pip install ipython
pip freeze (requirements.txt 파일에 설치된 모든 패키지와 버전 기록)
pip freeze > requirements.txt
설치가 끝났으면 실행
python manage.py shell_plus
이렇게 나오면 성공👍
그럼 shell을 사용해볼까?👌
2. CRUD with Shell
django shell
python manage.py shell
install django-extensions
pip install django-extensions
install ipython
pip install ipython
settings.py 앱 등록
"django_extensions",
pip freeze
pip freeze > requirements.txt
django shell_plus
python manage.py shell_plus
전체 Article 조회하기
Article.objects.all()
하나의 Article 생성하기(1)
article = Article() article.title = 'first_title' article.content = 'my_content' # 여기에서 전체 Article을 조회해보면 Article.objects.all() # 비어있다 # save()하기전에는 저장되지 않음 article.save() # 다시 전체 Article을 조회해보면 하나의 아티클이 있음 Article.objects.all() # 속성 하나씩 접근하기 # 제목 article.title # 내용 article.content # 생성일시 article.create_at # pk(id) article.id
하나의 Article 생성하기(2)
Article.objects.create(title='third title', content='마지막 방법임') # save()가 필요하지 않음
str 사용하기
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) def __str__(self): return self.title
하나의 Article만 조회하기
Article.objects.get(id=1)
하나의 Article만 조회하기(예외발생)
Article.objects.get(content='my_content') # 두개 리턴되어 에러
조건으로 조회하기
Article.objects.filter(content='my_content')
Article 수정하기
article = Article.objects.get(id=1) article.title = 'updated title' article.save()
Article 삭제하기
article = Article.objects.get(id=2) article.delete()
'Django' 카테고리의 다른 글
Django Auth, Login & Logout (4) 2024.08.17 Django Form Class (0) 2024.08.17 Django HTTP Form (0) 2024.08.14 Django Template System (DTL 문법, 템플릿 상속) (0) 2024.08.13 Django MTV 패턴, Templates 작성 (0) 2024.08.12