책과 공식 문서를 함께 보면서 공부한다. Models는 Relational DB의 Relation과 유사하게 쓰이는 Django의 Table 단위라고 생각하면 되는 것 같다. Python 기반인 만큼, Class로 정의되어 안에 Data field와 메서드를 선언해서 사용한다.
App을 생성하면 자동적으로 만들어지는 '<앱이름>.apps.<앱이름>Config'를 프로젝트의 config/settings.py, INSTALLED_APPS에 추가해주면, 프로젝트 단위로 Models의 변경사항을 Update 할 수 있게 된다.
Models는 해당 앱의 models.py 안에 django.db.models.Model을 상속받아 작성해두면 된다. 해당 모델을 DB Schema에 추가하고 관리하기 위해서는 Migration이 필요하다.
Migration을 통해 Models의 변경사항을 적용한다. python manage.py shell
을 통해서 Django Shell을 열고, python manage.py makemigrations
로 모델의 변경 사항 파일 만들기를, python manage.py migrate
로 migration을 apply를 하게 된다. 일종의 version control인 것이다. sqlmigrate를 사용하면 Create Table과 같은 SQL Query문을 확인할 수 있다.
이러한 모델화의 장점은, 프로그래머의 실력에 따라 성능과 효율이 왔다갔다하는 SQL Query문과는 다르게(Unique한 Goal에 대해 Unique하지 않은 다양한 Instruction들이 만들어질 수 있다.), 메서드를 사용해서 효율성을 보장한 채로 DB 작업을 할 수 있다는 것이다. 또한 유지보수가 간단하다는 점도 강점. 이렇게 Model을 사용해 DB와 연동하는 것을 Object Relational Mapping이라고 한다.
Model이 결국 Class인 만큼, instance 만들듯 사용하면 된다. m = Model(field=val)
. 이렇게 하고난 후 Save를 해줘야 반영이 된다. m.save()
. 또한 id도 자연스럽게 주어진다.
Model의 데이터 조회는 Model.objects를 통해서 할 수 있다. .all()을 통해 전체 조회도 가능하고, 조건부 검색도 가능하다. 하나의 결과에 대해서는 first = m.get(id=1)
식으로, 여러 개의 검색결과를 갖는 다양한 조건에 대해서는 text = m.filter(attribute__contains="str")
.
Model 내부 데이터 수정은 그냥 위 방법대로 불러와서 하면 된다. 하고 나면 model.save()를 통해서 수정 사항을 저장할 수 있다. delete도 가능하다.
한 Model이 다른 Model을 Foreign Key로 사용하는 경우, Foreign-key로 사용되는 Model이 해당 Model에 역방향 접근을 하기가 일반적으로는 어렵다. Django는 <model.set>을 통해 이러한 역방향 접근을 간단히 할 수 있도록 하였다.
python manage.py createsuperuser
로 생성 가능, Localhost/admin을 통해 관리자 페이지를 만들 수 있다.
모델을 Admin을 통해서 관리하려면, 위 경로로 가서 로그인 한 뒤, 관리하고자 하는 Model이 있는 APP의 디렉토리로 가서 admin.py를 수정해준다.
from django.contrib import admin
from .models import Question
admin.site.register(Question)
위 대로 register를 하면, 해당 Model을 Web GUI를 통해 Modify할 수 있게 된다.
다양한 사용법은 여기에 나와있다.
Commit, Push하고 마무리! 일이 많아서 피곤하다...