ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Django Model, Migration, ORM, Database API
    Django 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
Designed by Tistory.