우선 Django 프로젝트 생성전에 파이썬 가상환경 먼저 생성해준다.
$ conda create -n test02 python=3.8
생성한 가상환경을 활성화
$ conda activate test02
장고를 설치하자
$ conda install django
Collecting package metadata (current_repodata.json): done
Solving environment: done
==> WARNING: A newer version of conda exists. <==
current version: 4.8.2
latest version: 4.8.3
Please update conda by running
$ conda update -n base -c defaults conda
## Package Plan ##
environment location: /home/sungjunjin/miniconda3/envs/test02
added / updated specs:
- django
The following NEW packages will be INSTALLED:
asgiref pkgs/main/noarch::asgiref-3.2.5-py_0
django pkgs/main/noarch::django-3.0.3-py_0
pytz pkgs/main/noarch::pytz-2019.3-py_0
sqlparse pkgs/main/noarch::sqlparse-0.3.0-py_0
Proceed ([y]/n)? y
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
프로젝트 생성
django-admin startproject test02
우선 test02/setting.py에서 프로젝트를 개발하기전에 초기 설정 먼저 해준다.
test02/settings.py
INSTALLED_APPS의 admin,auth 주석처리
33 INSTALLED_APPS = [
34 # 'django.contrib.admin',
35 # 'django.contrib.auth',
36 'django.contrib.contenttypes',
37 'django.contrib.sessions',
38 'django.contrib.messages',
39 'django.contrib.staticfiles',
40 ]
41
MIDDLEWARE CSRF, auth 주석처리
42 MIDDLEWARE = [
43 'django.middleware.security.SecurityMiddleware',
44 'django.contrib.sessions.middleware.SessionMiddleware',
45 'django.middleware.common.CommonMiddleware',
46 # 'django.middleware.csrf.CsrfViewMiddleware',
47 # 'django.contrib.auth.middleware.AuthenticationMiddleware',
48 'django.contrib.messages.middleware.MessageMiddleware',
49 'django.middleware.clickjacking.XFrameOptionsMiddleware',
50 ]
세팅이 완료 후 테스트를 위해 runserver를 실행시켜보자.
하지만 마지막 세팅이 하나 남았다.
test02/urls.py
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
앞서 settings.py의 INSTALLED_APPS 리스트에서 admin을 주석처리했으므로 초기 세팅되어있는 admin url을 삭제시켜준다.
from django.contrib import admin
from django.urls import path
urlpatterns = [
]
초기설정 완료 후 테스트
(test02) sungjunjin@sungjunjin ~/devel/test02 python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
You have 3 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
April 03, 2020 - 10:38:23
Django version 3.0.3, using settings 'test02.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
서버는 잘 돌아가지만 중간에 You have 3 unapplied migration(s) 뭐라고 경고 메세지가 나온다. 아직 생성한 APP도, Model도 없으니 패스.
초기설정 테스트가 끝났으니 본격적으로 APP을 만들어보자 manage.py가 있는 경로로 이동한다
django-admin startapp user
user App이 생성되었다.
user App을 만들었으니 test02/settings.py에 INSTALLED_APPS에가서 등록해주자.
user model 먼저 만들어주자
test02/user/models.py
from django.db import models
class User(models.Model) :
name = models.CharField(max_length=50)
email = models.CharField(max_length=50)
password = models.CharField(max_length=300)
created_at = models.DateTimeField(auto_now_add = True)
updated_at = models.DateTimeField(auto_now = True)
class Meta :
# 실제로 데이터베이스 table에 저장되는 이름이다.
# SQL 테이블명은 복수형
db_table = 'users'
migrations 파일을 생성하자
$ python manage.py makemigrations user
생성한 migration 파일을 적용시키자. 테이블 구조가 Sqlite3에 생성된다.
$ python manage.py migrate
Operations to perform:
Apply all migrations: contenttypes, sessions, user
Running migrations:
Applying contenttypes.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying sessions.0001_initial... OK
migration 적용 현황 보기
Raw Sql Table 보기
$ sqlmigrate user 0001
BEGIN;
--
-- Create model User
--
CREATE TABLE "users" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(30) NOT NULL, "email" varchar(50) NOT NULL, "password" varchar(50) NOT NULL);
sqlite3
.open db.sqlite3
Shell의 save.()를 호출하면 실제로 앱에 데이터가 저장된다
>>> User( name= 'jsj', email = 'test@test.net', password = '123412314').save()
QuerySet으로 반환되는 데이터는 JSON Response로 보내기 위해 list 형변환 작업을 해야 한다.
>>> user_data = User.objects.all()
<QuerySet [<User: User object (1)>, <User: User object (2)>, <User: User object (3)>]>
>>> list(user_data)
[<User: User object (1)>, <User: User object (2)>, <User: User object (3)>]