[Django] Model

ITmakesmeSoft·2022년 10월 29일
0

Django

목록 보기
6/10
  • 보통 데이터베이스에 데이터를 저장 및 조회하기 위해서는 SQL 쿼리문을 이용
  • Django는 Model을 통해 SQL 쿼리문 없이도 데이터베이스에 접속하고 관리함
  • 사용자가 저장하는 데이터들의 필수적인 필드들과 동작들을 포함하고 있음
  • 일반적으로 각각의 모델은 하나의 데이터베이스 테이블에 매핑
    (mapping : 하나의 값을 다른 값으로 대응시키는 것)
    - 모델 클래스 1개 == 데이터베이스 테이블 1개

👉 Django ORM

Object-Relational Mapping의 약자로 객체(Object)와 관계형 데이터베이스(Relational Database)의 데이터를 매핑(Mapping)해주는 것을 의미한다. 객체 간의 관계를 바탕으로 SQL을 자동 생성하여 sql쿼리문 없이도 데이터베이스의 데이터를 다룰 수 있게 해준다.
데이터베이스의 테이블을 객체지향 프로그래밍에서 흔히 사용하는 객체(Class)처럼 사용할 수 있도록 해주는 기술이다.
기존 쿼리문을 작성하여 데이터베이스를 조작하는 것을 넘어서서 더 효율적이고 가독성 및 유지 보수에 적합한 코드를 만들기 위해 나온 기술이다.

http://www.incodom.kr/Django_ORM


Model 생성

  • 각 애플리케이션 디렉토리 내 생성된 models.py에 모델 클래스를 정의하여 생성
  • Demo라는 모델 클래스를 정의하고, title과 content, created_at, updated_at 필드 생성
  • 모델 클래스명은 단수형(첫 글자는 대문자)으로 작성
    • articles (X) , Article (O)

      # models.py
      
      from django.db import models
      
      class Demo(models.Model):
          title = models.CharField(max_length=30)
          content = models.TextField()
          created_at = models.DateTimeField(auto_now=True)
      		updated_at = models.DateTimeField(auto_now_add=True)

Field Type

  • CharField : 제한된 문자열 필드 타입. max_length를 지정해야 함
  • TextField : 대용량 문자열을 갖는 필드 타입
  • IntegerField : 32비트 정수형 필드 타입. 정수 사이즈에 따라 BigIntegerField, SmallIntegerField를 사용할 수도 있음
  • BooleanField : True/False 필드 타입. NULL을 허용하기 위해서는 NullBooleanField를 사용
  • DateTimeField : 날짜와 시간을 갖는 필드 타입. 날짜만 가질 경우 DateField, 시간만 가질 경우 TimeField를 사용할 수도 있음
  • DecimalField : 소수점을 갖는 decimal 필드 타입
  • BinaryField : binary 데이터(2진수)를 저장하는 필드 타입
  • FileField : 파일 업로드 필드 타입
  • ImageField : FIleField의 파생 클래스로, 이미지 파일 여부를 체크
  • UUIDField : GUID(UUID)를 저장하는 필드 타입

Field options

  • null (DB 옵션) : DB Field에 NULL 허용 여부 (default : False)
  • unique (DB 옵션) : 유일성 여부 (default : False)
  • blank : 입력값 유효성 (validation) 검사 시 empty 값 허용 여부 (default : False)
  • primary_key : 해당 필드가 Primary Key임을 표시 (primary_key = True)
  • default : 필드의 디폴트 값을 지정
  • verbose_name : Field label이 지정되지 않으면 필드명이 쓰여짐
  • validators : 입력값 유효성 검사를 수항할 함수를 다수 지정
    각 필드마다 공유한 validators들이 이미 등록되어 있기도 함
    ex) 이메일 형식, 길이 제한 등
  • choices (form widget용) : select box 소스로 사용
  • help_text (form widget용) : 필드 입력 도움말 지정
  • auto_now : True 인 경우, record 수정 시마다 현재 시간을 자동 저장
  • auto_now_add : True 인 경우, record 생성 시 현재 시간으로 자동 저장(최초 저장시에만 적용)
    models.IntegerField(null = True)
    models.IntegerField(unique = True)
    models.DateTimeField(blank = True)
    models.CharField(max_length = 10, primary_key = True)
    models.CharField(max_length=5, default="ssafy")

Migrations

  • 모델에 대한 청사진(blueprint)을 만들고, 이를 통해 테이블을 생성하는 일련의 과정
  • Django가 Model에 생긴 변경사항을 DB에 등록

등록 절차

  1. models.py에 모델 클래스 정의
  2. makemigrations, migrate 실행

makemigrations

  • 모델을 작성 혹은 변경한 것에 기반한 새로운 설계도를 만들 때 사용.
  • 테이블을 만들기 위한 설계도를 생성하는 것
  • 명령어 실행 후 migrations/0001_initial.py가 생성
    $ python manage.py makemigrations

migrate

  • makemigrations로 만든 설계도를 실제 db.sqlite3 DB파일에 반영
  • 결과적으로 모델에서의 변경사항들과 DB의 스키마가 동기화를 이룸
    $ python manage.py migrate

showmigrations

  • migrations 파일들이 정상적으로 migrate 됐는지 여부를 확인하는 용도로 사용
  • 표시가 된 경우 migrate 완료되었음을 의미
    $ python manage.py showmigrations

sqlmigrate

  • 해당 migrations 파일이 SQL 문으로 어떻게 해석될 지 미리 확인할 수 있음
    $ python manage.py sqlmigrate articles 0001

DB 초기화

  1. migrations 파일 삭제
    1. migrations 폴더 및 __init__.py 는 삭제하지 않음
    2. 번호가 붙은 파일만 삭제
  2. db.sqlite3 삭제
  3. migrations 진행
    1. makemigrations
    2. migrate

점프 투 파이썬

예제로 배우는 파이썬 프로그래밍 - Django 모델 (Model)

profile
💎 Daniel LEE | SSAFY 8th

0개의 댓글