django | February 13, 2020
#현재 프로젝트 폴더
firstproject/ #하위 폴더 중 같은 이름의 폴더가 자동으로 생성되므로(mysite), 이름 바꿔도 됨
manage.py
polls/ #startapp으로 생성
__init__.py
admin.py
apps.py #PollsConfig 함수가 기본적으로 입력되어 있다.
#이 함수 경로를 settings.py의 installed_apps에 추가해서 앱을 포함시킨다
migrations/
__init__.py
models.py
tests.py
views.py #결과를 실행할 함수들이 들어있음. request는 ip
urls.py #새로 생성한 파일. path가 view의 함수를 실행하도록 만듦.
mysite/ #startproject으로 생성
__init__.py
settings.py
urls.py #최상위 URLconf에서 polls.urls 모듈을 바라보게 설정
asgi.py
wsgi.py
import json
from django.views import View
from django.http import JsonResponse
class MainView(View):
def get(self, request):
return JsonResponse({"Hello":"World"}, status=200)
View 클래스의 속성 및 메소드까지 다 상속 받아서 사용가능하다.
원래 존재하는 메소드인데 서브클래스에서 새로 정의할 경우에는 덮어씌우기가 된다.
from django.urls import path
from main.views import MainView
urlpatterns = [
path('', MainView.as_view())
]
#설치방법 Ubuntu
sudo apt install httpie
#설치방법 Mac
brew install httpie
장고는 별도로 DB를 설치하지 않아도 SQLite3
라는 경량화 된 DB를 제공한다. 그리고 이를 컨트롤 하기 위해 ORM
을 제공한다.
Object Relational Mapping, ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다. 데이터베이스 데이터 <—매핑—> Object 필드 객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.
ORM을 사용하면서 원하는 모델을 작성하고 다루는 곳이 models.py 파일. DATABASE를 잘 몰라도 models.py 를 통해 DB를 관리할 수 있다.
model이란: 부가적인 메타데이터를 가진 데이터베이스의 구조(layout)
[Metadata]
data에 대한 data. 속성정보
data를 표현하기 위한 목적(ex.HTML)과 data를 빨리 찾기 위한 목적으로 주로 사용
database에서는 data의 index구실을 하므로, data를 빨리 찾을 수 있다.
Django는 DRY 원칙을 따른다.
[DRY 원칙]: 반복하지 말 것
고유한 개념 및 데이터는 단 한 번, 단 한 곳에 존재하는 것으로 족한다.
중복성은 나쁜 것, 정규화는 좋은 것
Django는 이 원칙에 따라 최소한의 것들을 가지고 최대한의 것을 만들어내도록 한다.
Database의 각 필드는 Field 클래스의 인스턴스로서 표현된다.
class CharField(max_length=None, **options)
:class DateTimeField(auto_now=False, auto_now_add=False, **options)
:class ForeignKey(to, on_delete, **options)
: 관계설정to
; model과 연관되는 class명
on_delete=models.CASCADE
; ForeignKey가 바라보는 값이 삭제될 때, ForeignKey를 포함하는 model instance(row)도 삭제된다.#polls/models.py
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
#question_text;이게 필드이며, database의 column명으로 사용된다.
#아니그럼... CharField 이건 뭐야? 다 field라고 붙는데??
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
model에 입력된 정보를 가지고 django는:
#mysite/settings.py
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
#firstproject; 가장 상위의 directory에서 입력
$ python manage.py makemigrations polls
#firstproject; 가장 상위의 directory에서 입력
$ python manage.py sqlmigrate polls 0001
#이건 실제로 run the migration 하는 게 아니라 보여주기만 하는 것
$ python manage.py migrate #초기 세팅할 때 했던 명령과 같다.
makemigrations
-models.py에서 생성, 변경한 내용으로 테이블의 틀을 만들어 놓는다.
-테이블 모양과 구조 등만 잡아줄 뿐 실제로 테이블이 생기는 것은 아니다.
migrate
-makemigrations만 한다고 테이블이 생기는 게 아니다.
-migrations를 실행(run)해서 실제 database query에 날려서 data를 저장하고 테이블을 만드는 명령어.
-model에서의 변경 사항들과 database schema의 동기화가 이루어진다.
app_name.models.py
에서 model을 생성 및 변경한다.python manage.py makemigrations
로 이 변경사항에 대한 migration을 만든다.python manage.py migrate
로 변경사항을 database에 적용한다.$ python manage.py shell
$ python manage.py runserver
$ python manage.py createsuperuser
Reference:
- https://docs.djangoproject.com/ko/3.0/intro/tutorial02/
- https://docs.djangoproject.com/ko/3.0/misc/design-philosophies/#dry
- https://lee-seul.github.io/django/backend/2018/01/28/django-model-on-delete.html