[Python][Django] 모델

2019. 1. 11. 00:15· Python/Django
반응형
모델(Model)생성

1. 앱(app) 생성
    ex) `app_blog`라는 앱 생성한다.
(venv) C:\PycharmProjects\DjangoStart>python manage.py startapp app_blog

2. settings.py 파일에서 `INSTALLED_APPS`에 방금 생성한 app 추가.
   추가하므로서, 장고에 해당 앱을 사용해야 한다고 알려주게 된다.
# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app_blog'
]

3. 모델 생성
`app_blog/models.py`에 모델을 정의한다.
  • 저자(Author)는 이름first_name, 성last_name, 이메일email를 갖는다.
  • 출판사(Publisher)는 이름name, 주소address, 웹주소website를 갖는다.
  • 책(Book)은 제목title, 발행일publication_date, 하나 이상의 작성자authors(저자와 다대다 관계), 하나의 출판사publisher(출판사와 일대다 관계 - 외래키)를 갖는다.
from __future__ import unicode_literals

from django.db import models
from django.utils import timezone

# Create your models here.
class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    website = models.URLField()

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateTimeField(default=timezone.now)
  • models.CharField : 글자 수가 제한된 텍스트 정의. max_length 로 글자 크기 제한.
  • models.TextField : 글자 수에 제한이 없는 긴 텍스트 정의.
  • models.IntegerField : 정수 정의.  -2147483648 ~ 2147483647
  • models.DateField : 날짜 정의.
  • models.DateTimeField : 날짜와 시간 정의.
  • models.ForeignKey : 다른 모델에 대한 링크 의미. 즉, 외래키(일대다) 설정.
  • models.EmailField : email 정의.  EmailValidator 사용함.
  • models.URLField : url 정의.
  • models.ManyToManyField : 다대다 관계 정의. ManyToManyField를 사용하면 장고는 다대다 조인 테이블을 추가로 생성함.
  • models.AutoField : 값을 증가의 자동 시퀀스를 생성.
  • 그 외 https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-types 참고.

4. 모델 유효성 검사
    `check`명령어를 통해 장고 프로젝트의 유효성 검사를 위한 시스템(정적) 검사 프레임워크 실행한다.    
    올바르게 입력된 경우 "System check identified no issues (0 silenced)."가 나타난다.
(venv) C:\PycharmProjects\DjangoStart>python manage.py check
System check identified no issues (0 silenced).

5. 데이터베이스에 모델을 위한 테이블 생성
    장고 모델에 `makemigrations [app name]` 명령어를 통해 변경된 사실을 알린다.    
(venv) C:\PycharmProjects\DjangoStart>python manage.py makemigrations app_blog
Migrations for 'app_blog':
  app_blog\migrations\0001_initial.py
    - Create model Author
    - Create model Book
    - Create model Publisher
    - Add field publisher to book
    마이그레이션(migration)은 장고가 모델(및 데이터베이스 스키마)에 변경 사항을 저장하는 방법이며, 
    디스크에 있는 파일일뿐이다.
    migrations폴더에 0001_initial.py파일이 생성된 것을 볼 수 있다.


  • `sqlmigrate [app name] [migration number]` 명령어는 migrations을 SQL문으로 리턴한다. 
  • `sqlmigrate`는 실제로 테이블을 만들거나 데이터베이스에 접근하는 것이 아닌, 단지 화면에 장고가 어떤 SQL을 실행하는지를 볼수 있도록 한다.
  • "sqlmigrate app_blog 0001" 는 app_blog 앱에 migrations된 0001번 파일을 SQL문으로 리턴한다는 의미이다.
(venv) C:\PycharmProjects\DjangoStart>python manage.py sqlmigrate app_blog 0001
BEGIN;
--
-- Create model Author
--
CREATE TABLE "app_blog_author" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "first_name" varchar(30) NOT NULL, "last_name" varchar(40) NOT NULL, "email" varchar(254) NOT NULL);
--
-- Create model Book
--
CREATE TABLE "app_blog_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(100) NOT NULL, "publication_date" datetime NOT NULL);
CREATE TABLE "app_blog_book_authors" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "book_id" integer NOT NULL REFERENCES "app_blog_book" ("id"), "author_id" integer NOT NULL REFERENCES "app_blog_author" ("id"));
--
-- Create model Publisher
--
CREATE TABLE "app_blog_publisher" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(30) NOT NULL, "address" varchar(50) NOT NULL, "website" varchar(200) NOT NULL);
--
-- Add field publisher to book
--
ALTER TABLE "app_blog_book" RENAME TO "app_blog_book__old";
CREATE TABLE "app_blog_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(100) NOT NULL, "publication_date" datetime NOT NULL, "publisher_id" integer NOT NULL REFERENCES "app_blog_publisher" ("id"));
INSERT INTO "app_blog_book" ("publication_date", "publisher_id", "id", "title") SELECT "publication_date", NULL, "id", "title" FROM "app_blog_book__old";
DROP TABLE "app_blog_book__old";
CREATE INDEX "app_blog_book_publisher_id_51113824" ON "app_blog_book" ("publisher_id");
COMMIT;
    • 테이블 이름은 `앱(app)이름_모델이름`형식으로 자동 생성된다. 
    • 각 테이블에 기본 키가 선언하지 않은 경우 장고는 자동으로 기본 키(id 필드)를 자동으로 생성한다.
    • 외래 키는 필드 이름에 "_id"를 추가한다.
    • 외부 키 관계는 REFERENCES문에 의해 명시적으로 작성된다.
  • `migrate` 명령어는 최신 migrations파일을 갖고와서 데이터베이스 스키마를 자동으로 업데이트 한다.
(venv) C:\PycharmProjects\DjangoStart>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app_blog, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying app_blog.0001_initial... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying sessions.0001_initial... OK


이제 데이터베이스에 모델이 생성완료되었다.





참고 : 장고마스터하기


반응형
저작자표시 비영리 변경금지 (새창열림)

'Python > Django' 카테고리의 다른 글

[Django] context_processors 콘텍스트 프로세서  (0) 2019.01.16
[Python][Django] HttpRequest 객체 정보  (0) 2019.01.12
[Python][Django] settings.py 의 Database API  (0) 2019.01.10
[Python][Django] settings.py 의 템플릿 로딩 API  (0) 2019.01.08
[Python][Django] Template Tag < For >  (0) 2019.01.07
'Python/Django' 카테고리의 다른 글
  • [Django] context_processors 콘텍스트 프로세서
  • [Python][Django] HttpRequest 객체 정보
  • [Python][Django] settings.py 의 Database API
  • [Python][Django] settings.py 의 템플릿 로딩 API
S0PH1A
S0PH1A
반응형
S0PH1A
Web Programmer
S0PH1A
전체
오늘
어제
  • 전체
    • About Me
    • Python
      • Python
      • Django
    • DataBase
      • MySQL
      • MongoDB
    • JAVA
      • JAVA
      • Spring
    • WEB
      • JavaScript
      • HTML
      • CSS
      • Vue.js
      • React
      • Nest.js
      • Node.js
      • Electron
      • PHP
    • Linux
    • Algorithm
    • 기타
    • 생각
    • App
      • ReactNative

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • electron
  • vue
  • Python
  • vue.js
  • nodejs
  • mysql
  • django
  • Error
  • install
  • javascript

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
S0PH1A
[Python][Django] 모델
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.