Python/Django

[Python][Django] 모델

S0PH1A 2019. 1. 11. 00:15
반응형
모델(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


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







반응형