티스토리 뷰
AI웹 개발자 과정 공부 (팀스파르타)/Django (장고)
24.04.19_TIL (1) (Django Model & ORM & CRUD)
티아(tia) 2024. 4. 19. 21:09728x90
++ 장고 공식 문서는 항상 확인하기
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) #수정될때마다
⇒ 기존에 생성한 데이터들은 어떻게 하겠냐고 묻습니다.
- 값하나를 주면 그 값을 다 넣는 방식
- 일단 종료하고 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()
반응형
'AI웹 개발자 과정 공부 (팀스파르타) > Django (장고)' 카테고리의 다른 글
24.04.19_TIL (3) (Django MTV CRUD - 2 ) (0) | 2024.04.19 |
---|---|
24.04.19_TIL (2) (Django MTV CRUD - 1 ) (0) | 2024.04.19 |
24.04.18_TIL (3) (Django 다중 앱과 URL) (1) | 2024.04.18 |
24.04.18_TIL (2) (Django HTTP form) (0) | 2024.04.18 |
24.04.18_TIL (1) (Django Template System) (1) | 2024.04.18 |