본문 바로가기

Backup/Django

[Django #2] Models

이번장에서는 Django의 핵심인 Models 에 대해 알아보겠다.


우선 Tutorial model을 만들어 볼것이다. 

Tutorial model에 게시글 기능을 할수있도록 일단 제목, 날짜, 내용 작성의 기능을 가지도록 만들어 보겠다. 

Django는 확작성이 좋기때문에 나중에 더 필요한 기능을 쉽게 추가해줄수도있다.

이 모델들은 해당 app에서 unique 해야 한다.


mysite/main/models.py

from django.db import models class Tutorial(models.Model): tutorial_title = models.CharField(max_length=200) tutorial_content = models.TextField() tutorial_published = models.DateTimeField('date published') def __str__(self): return self.tutorial_title


모든 모델들은 models.Model로 부터 상속받는다. 그리고 나서 필요한 field들을 추가 해나가면 된다.

title은 비교적 길이가 작을테니 field 속성을 CharField로 만든다. 이 속성들은 database에 추가될것이다.

CharField(제목 속성에 사용)와  TextField(게시글 속성에 사용)의 차이점은 글크기의 제한이 있냐 없냐의 차이다.

자세한건 여기서 확인 --> django model fields documentation.

그리고 __str__을 override 시키는 이유는 나중에 보기에서 더 가독성있게 읽을 수 있게 하기 위함이다.



model에 수정사항이 생길때마다 migration을 해줘야 한다.

이를  위해선 manage.py를 통해 두가지스텝을 진행하여야 한다.

1) makemigrations을 실행
2) 그리고 나서 migrate



그럼 아래와 같이 쳐보자.


python3 manage.py makemigrations No changes detected

What?



이는 Django가 installed 된 app 부분만 적용하기 때문이다.



mysite/mysite/settings.py 가서 'main.apps.MainConfig'를 아래처럼 추가해라 INSTALLED_APPS 

mysite/mysite/settings.py

INSTALLED_APPS = [
    'main.apps.MainConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

근데 이 파일이 실제로 존재하는가? 아래 경로에서 확인해  보면.... 있다


mysite/main/apps.py:

from django.apps import AppConfig


class MainConfig(AppConfig):
    name = 'main'



자 이제 migration

python3 manage.py makemigrations
Migrations for 'main':
  main\migrations\0001_initial.py
    - Create model Tutorial

이렇게하면 그냥 migration이 생길수있도록 코드를 build하는거 뿐이고 적용되지는 않는다.


이 준비상태를 확인해보려면


mysite/main/migrations.에서  0001_initial.py를 까봐라.


0001_initial.py

# Generated by Django 2.1.5 on 2019-01-11 01:35

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Tutorial',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('tutorial_title', models.CharField(max_length=200)),
                ('tutorial_content', models.TextField()),
                ('tutorial_published', models.DateTimeField(verbose_name='date published')),
            ],
        ),
    ]

SQL을 안다면 이게 무슨짓을 하려는 것인지 알것이다.

만약 위의 내용을 정확히 SQL로 수행하려 한다면 아래와 같이 치면된다.


python3 manage.py sqlmigrate main 0001

BEGIN;
--
-- Create model Tutorial
--
CREATE TABLE "main_tutorial" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "tutorial_title" varchar(200) NOT NULL, "tutorial_content" text NOT NULL, "tutorial_published" datetime NOT NULL);
COMMIT;


그런데 보통 이렇게는 안하고 그냥 model 을 생성하거나 수정하고나서

1)Run a make migrations

2) run a migrate 한다.


python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, main, 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 admin.0003_logentry_add_action_flag_choices... 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 auth.0009_alter_user_last_name_max_length... OK
  Applying main.0001_initial... OK
  Applying sessions.0001_initial... OK


이전에 runserver할떄 나왔던 migration 들도 다 migrate된것을 확인할수있다.

물론 Tutorial model도 보인다


Applying main.0001_initial... OK


이제 이 모델에 실제 tutorial 데이터를 추가해보자.

이를 빠르고 간단하게(지금은 test니까) 하는방법으로 shell을 사용하는 것이다.

이것또한 manage.py를 통해서 사용할수있다.


python3 manage.py shell

Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)


이것으로 view, controller없이 interactive하게 빠르게 test해볼수있다. 

>>> from main.models import Tutorial
>>> Tutorial.objects.all()
<QuerySet []>


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

[Django #6] User Registration  (1) 2019.02.04
[Django #5] CSS  (0) 2019.02.03
[Django #4] Views and Templates  (0) 2019.02.03
[Django #3] Admin and Apps  (1) 2019.02.02
[Django #1] Django Web Development with Python Introduction  (0) 2019.01.27