django 6. ORM

dev-somi·2022년 1월 18일
0

django

목록 보기
5/13

1. 데이터베이스와 SQL

  • RDBMS (관계형 데이터베이스 관리 시스템)
  • NoSQL
  • SQL은 데이터베이스에 쿼리하기 위한 언어이다.
    직접 만들어내기도 하지만, ORM을 통해 SQL을 생성/실행하기도 한다. 하지만 ORM을 쓰더라도, 내가 작성한 코드를 통해 어떤 SQL이 실행되고 있는지 파악하고 이를 최적화할 수 있어야 한다.
    (django-debug-toolbar를 적극 활용)
  • 장고 3.0.2 기준으로 기본 제공되는 backends: mysql, oracle, sqlite3
  • 장고의 model과 form을 통해서 수월하게 데이터베이스 작업이 가능하다.

2. 장고 shell 실행 방법

(venv01) (base) djangoPR % python3 manage.py shell
Python 3.8.8 (default, Apr 13 2021, 12:59:45)
[Clang 10.0.0 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
from django.db import connection
cursor = connection.cursor()
cursor.close()
exit()

장고 shell을 열고 connection을 통해서 cursor을 획득 후 진행

3. Django Model 설계

  • 데이터베이스 테이블과 파이썬 클래스를 1:1로 매핑
  • 모델의 클래스명은 단수형 지정 (ex. Post)
  • 매핑되는 모델 클래스는 DB 테이블 필드 내역이 일치해야 함
  • 모델을 만들기 전에, 서비스에 맞게 데이터베이스 설계가 필수
  • 장고와 별도로 관계형 데이터베이스 학습도 필요,,,
    실제 서비스를 창출할 때는 DB에 대해서 학습을 해야 한다.
  1. 모델 활용 순서 (개발 순서)
  • 장고 모델을 통해, 데이터베이스 형상을 관리할 경우
    1. 모델 클래스 작성
    2. makemigrations를 통해서 클래스로부터 마이그레이션 파일 생성
    3. migrate 명령을 통해 앞서 생성했던 파일을 DB에 적용
    4. 모델 활용
  • 장고 외부에서, 데이터베이스 형상을 관리할 경우
    1. DB로부터 모델 클래스 소스 생성 (inspectdb 명령)
    2. 모델 활용

4. 실제로 모델 생성해보기

  1. 만들고 싶은 앱을 생성한다.

    python3 manage.py startapp 앱이름

  2. settings.py에 들어가서 생성한 app을 등록한다.

나는 instagram이라는 이름을 가진 앱을 생성했고 INSTALLED_APPS 리스트에 등록을 함

  1. 생성했던 앱 파일 밑에 urls.py를 만든다.

  1. url.py 밑에 urlspattern이라는 리스트를 만든다.

from django.urls import URLPattern
urlpatterns = []

  1. 생성했던 앱 밑에 있는 Models.py 밑에 model class를 생성한다.

from django.db import models
class Post(models.Model):
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
pass

  1. 터미널에 makemigrations, migrate 명령 실행

    (venv01) (base) djangoPR % python3 manage.py makemigrations instagram
    Migrations for 'instagram':
    instagram/migrations/0001_initial.py
    - Create model Post
    (venv01) (base) djangoPR % python3 manage.py migrate instagram
    Operations to perform:
    Apply all migrations: instagram
    Running migrations:
    Applying instagram.0001_initial... OK
    (venv01) (base) kdjangoPR % python3 manage.py sqlmigrate instagram 0001_initial

  1. 그러면 아래와 같이 DB가 생성된다!!!

CREATE TABLE "instagram_post" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "message" text NOT NULL, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
COMMIT;

DB의 이름은 내가 만든 앱_class 명으로 생성이 되고 이게 디폴트 값임

5. 자주 쓰는 필드 공통 옵션

  • blank: validation시에 empty 허용 여부 (디폴트:False)
    이 옵션을 생략하게 되면 빈 문자열은 허용하지 않는다는 의미. 따라서 메시지 값이 없다면 model과 연동된 form에서 유효성 검사를 실패하게 된다. form을 사용하지 않고 model만 활용해서 저장하면 유효성 검사를 타지 않고 저장 된다...
  • null (DB 옵션): null 허용 여부 (디폴트: False)
  • validators: validators를 수행할 함수를 다수 지정
    모델 필드에 따라 고유한 validators들이 등록 (ex. 이메일만 받기)

1대 1의 관계: OneToOneField
1대 N의 관계: ForeignKey(1에 해당하는 변수)
N대 N의 관계: ManyToManyField

  • 최대한 필드타입을 타이트하게 지정해주는 것이, 입력값 오류를 막을 수 있다.
  • 백엔드에서의 유효성 검사는 필수
    - 모델이 장고개발의 절반..

0개의 댓글