2016-11-18

Django 1.10.3 Tutorial : 모델 생성


  • 프로젝트에서 메인으로 사용할 앱을 생성한다.
    $ cd $PRJNAME/web
    $ python manage.py startapp prjname
  • $PRJNAME/web/web/settings.py 의 INSTALLED_APPS 에 'prjname.apps.PrjnameConfig' 을 추가한다.
  • models.py 를 삭제하고, models 디렉토리를 생성한다.
    $ cd $PRJNAME/web/prjname
    $ rm -rf models.py
    $ mkdir models
    $ cd models
    $ touch __init__.py
  • Admin 모델을 생성한다. models 디렉토리에 admin.py 를 생성하고, __init.py__ 에 추가한다.
    admin.py
    # -*- encoding: utf-8 -*-
    # prjname/models/admin.py
     
    # 참고 :
    # http://third9.tistory.com/261
    # http://blog.dokenzy.com/archives/1997
     
     
    # import hashlib
     
    from django.conf import settings
    from django.db import models
     
    # from .crypto import MyCrypto
     
     
    class AdminModel(models.Model):
        userid     = models.CharField(max_length=255, unique=True)
        password   = models.CharField(max_length=255) # Hash
        nick       = models.CharField(max_length=255, unique=True)
        mobile     = models.CharField(max_length=255) # Encrypt
        reg_date   = models.DateField(auto_now_add=True)
        last_login = models.DateTimeField(null=True)
     
     
        class Meta:
            db_table = 'TB_ADMIN'
            app_label = 'prjname'
     
     
        # def _get_mobile(self):
        #     crypto = MyCrypto()
        #     return crypto.decodeAES(self.mobile)
     
        # def _set_mobile(self, value):
        #     crypto = MyCrypto()
        #     self.mobile = crypto.encodeAES(value)
     
        # def _get_password(self):
        #     return self.password
     
        # def _set_password(self, passwd):
        #     self.password = hashlib.sha256(passwd.encode('utf-8')).hexdigest()
     
     
        # enc_mobile = property(_get_mobile, _set_mobile)
        # hashed_password = property(_get_password, _set_password)
    __init__.py
    from prjname.models.admin import AdminModel
  • migration 을 생성하고, migrate를 실행한다.
    $ cd $PRJNAME/web
    $ ./makemigrations.sh
    $ ./migrate.sh
    이렇게 하면 $PRJNAME/web 에 db.sqlite3 DB에 TB_ADMIN 이라는 테이블이 생성될 것이다.
  • 다음과 같이 테이블이 생성된 것도 볼 수 있다.
    $ cd $PRJNAME/web
    $ sqlite3 db.sqlite3
    SQLite version 3.15.0 2016-10-14 10:20:30
    Enter ".help" FOR usage hints.
    sqlite> .schema
    CREATE TABLE "django_migrations" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "app" VARCHAR(255) NOT NULL, "name" VARCHAR(255) NOT NULL, "applied" datetime NOT NULL);
    CREATE TABLE "TB_ADMIN" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "userid" VARCHAR(255) NOT NULL UNIQUE, "password" VARCHAR(255) NOT NULL, "nick" VARCHAR(255) NOT NULL UNIQUE, "mobile" VARCHAR(255) NOT NULL, "reg_date" DATE NOT NULL, "last_login" datetime NULL);
    CREATE TABLE "django_session" ("session_key" VARCHAR(40) NOT NULL PRIMARY KEY, "session_data" text NOT NULL, "expire_date" datetime NOT NULL);
    CREATE INDEX "django_session_de54fa62" ON "django_session" ("expire_date");sqlite> INSERT INTO admins(userid, password, nick) VALUES('testid1', 'passwd1', 'nick1');
    sqlite> INSERT INTO TB_ADMIN(userid, password, nick, mobile, reg_date) VALUES('testid1', 'passwd1', 'nick1', '010-1111-1111', '2016-11-16');
    sqlite> INSERT INTO TB_ADMIN(userid, password, nick, mobile, reg_date) VALUES('testid2', 'passwd2', 'nick2', '010-2222-2222', '2016-11-16');
    sqlite> INSERT INTO TB_ADMIN(userid, password, nick, mobile, reg_date) VALUES('testid3', 'passwd3', 'nick3', '010-3333-3333', '2016-11-16');
    sqlite> INSERT INTO TB_ADMIN(userid, password, nick, mobile, reg_date) VALUES('testid4', 'passwd4', 'nick4', '010-4444-4444', '2016-11-16');
    sqlite> INSERT INTO TB_ADMIN(userid, password, nick, mobile, reg_date) VALUES('testid5', 'passwd5', 'nick5', '010-5555-5555', '2016-11-16');
    sqlite> SELECT * FROM tb_admin;
    1|testid1|passwd1|nick1|010-1111-1111|2016-11-16|
    2|testid2|passwd2|nick2|010-2222-2222|2016-11-16|
    3|testid3|passwd3|nick3|010-3333-3333|2016-11-16|
    4|testid4|passwd4|nick4|010-4444-4444|2016-11-16|
    5|testid5|passwd5|nick5|010-5555-5555|2016-11-16|
    sqlite> .quit

댓글 없음:

댓글 쓰기