반응형
모델(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 |