Django

Django Model, Migration, ORM, Database API

monster route 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()