1. django module 맛보기
2. django template 맛보기
3. django model & ORM
이전글: 2024.05.25 - [Python] - [Python] django (2/3) template 맛보기
django ORM (Object Relational Mapping)은 SQL Query가 아닌 Object 기반의 DataBase을 접근하는 방식입니다. 프로젝트를 만들면 기본적으로 db.sqlite3 파일이 만들어져 있을 것입니다. 이 sql 파일을 접근하여 Table을 만들고 이를 제어하는 방법을 알아보도록 해 보겠습니다.
목표는 DataBase에 다음의 데이터들을 넣고 이것을 테이블 형태로 표시하는 것까지 진행하도록 하겠습니다.
date | name | price |
2024/06/06 | apple | 500 |
2024/06/07 | banana | 1000 |
앞에서 진행한 template 등이 함께 사용될 것이기 때문에 만약 잘 이해가 되지 않는 부분이 있다면 앞의 파트를 다시 읽어보시는 것도 괜찮을 것 같습니다. 일단 django project를 만들고, testapp이라고 앱을 만들고 시작하겠습니다.
pip install django
django-admin startproject config .
django-admin startapp testapp
추가된 앱에대한 config/settings.py, urls.py를 세팅해 줍니다. 이것에 대해서는 [1. django module 맛보기]을 참조하시기 바랍니다.
이제 testapp 폴더에 가보면 models.py 라는 파일이 있습니다. 이곳에 모델을 만들고 모델을 통해 views.py에서 Database에 접근한 후 template을 통해 Database를 표시하는 방향으로 진행하도록 하겠습니다.
from django.db import models
# Create your models here.
class FruitStorage(models.Model):
date = models.DateField()
name = models.TextField()
price = models.IntegerField()
DataBase에는 table이 app이름+class명으로 만들어집니다. 이에 따라 만들어질 테이블명을 생각하시면서 만드는 것이 좋습니다. 위의 내용은 testapp_fruitstorage 라는 table을 만드는데 date, name, price라는 필드를 가질 것이며, date는 날짜, name은 텍스트, price는 integer 형의 필드로 만들어 낼 것임을 의미합니다. models.Model을 상속받음으로서 앞으로는 이 클래스를 통해 Table에 직접 접근하게 됩니다. 이러한 ORM을 이용한 방법은 객체 프로그래밍에 좀 더 가깝게 데이터베이스를 접근하게 만듬으로서 로직과 DataBase간의 간극을 줄여줍니다. 물론 Query 문을 이용하는 것이 효율적인 경우가 많지만 간단한 경우 대체적으로 코드의 가독성이 좀 더 좋아질 겁니다.
이제 Table에 있는 내용을 웹페이지에서 뿌려 보도록 하겠습니다. [2. django template 맛보기]에서 배웠던 것처럼 template을 이용해 보도록 해보겠습니다. testapp/templates/testapp/index.html을 다음과 같이 만듭니다.
<body>
<table border="1" style="width: 100%;">
<tr>
<td>날짜</td>
<td>항목</td>
<td>가격</td>
</tr>
{% for date, name, price in items %}
<tr>
<td>{{ date }}</td>
<td>{{ name }}</td>
<td>{{ price }}</td>
</tr>
{% endfor %}
</table>
</body>
작업한 내용을 설명 드려보자면 table을 만들고, [날짜], [항목], [가격]이라는 컬럴을 만듭니다. 그리고 context를 통해 넘겨받은 items 리스트에서 date, name, price 순서로 데이터를 가져와 이를 그대로 뿌리는 template 입니다.
이제 views.py을 다음과 같이 만듭니다.
from django.shortcuts import render
from django.http import HttpResponse
from .models import FruitStorage
# Create your views here.
def index(request):
items = []
objs = FruitStorage.objects.all()
for obj in objs:
items.append((str(obj.date), obj.name, str(obj.price)))
context = {
'items': items,
}
return render(request, 'testapp/index.html', context)
우리가 만든 FruiteStorage의 모든 object 리스트를 얻고 그 object들을 for문을 돌면서 items에 date, name, price 필드를 수집합니다. 화면에 뿌리기 편하게 date, price는 텍스트로 변환 후 수집하였습니다. 그 이후 items을 context를 통해 전송하였습니다. 이제 python manage.py runserver 명령을 통해 실행해 보겠습니다. 그럼 웹페이지에 다음과 같은 오류가 발생합니다.
테이블을 찾을 수 없다고 합니다. 저희가 만들지도 않았었으니 당연한 결과입니다. 1장에서는 이유도 정확히 모르고 migrate라는 명령을 수행했었는데 사실 이런때가 migration이 필요한 경우입니다.
python manage.py makemigrations
python manage.py migrate
makemigrations은 현재의 model 파일과 database 상태를 체크하여 어떤 방법으로 DataBase을 변경해야 하는지 결정합니다. 지금의 경우에는 database에 테이블이 없었기 때문에 테이블을 만드는 작업을 수행하는 작업을 추가할 것이며, 다른 예로 코딩을 하다보면 테이블에 필드를 추가해야 하는 경우도 있을 겁니다. 이때 필드 추가후 makemigrations을 수행하면 현재 DataBase에는 필드가 없기 때문에 필드를 추가를 위한 추가 명령을 작업을 추가합니다. migrate 함수를 이 작업을 실제 수행하는 것이고요. 이제 위와 같이 수행하고 나면 기본적으로 원래 존재했던 db.sqlite3 파일에 table이 추가되고 웹페이지는 다음과 같이 오류가 나지 않게 됩니다.
하지만 당연하게도 table에는 항목이 하나도 들어있지 않기에 아무런 항목도 표시되지 않습니다. 이제 table에 항목을 추가해 보겠습니다. 웹페이지를 만들고 코드를 통해 추가할 수 있게 해도 좋지만 django에서는 간단한 경우 table을 관리할 수 있는 관리자 페이지를 제공합니다. 이것을 통해 테이블을 관리하고 싶다면 testapp/admin.py을 다음과 같이 수정해 줍니다.
from django.contrib import admin
from .models import FruitStorage
# Register your models here.
admin.site.register(FruitStorage)
#admin.register(FruitStorage)
이러면 관리자 페이지에서 해당 모델(Table)을 관리할 수 있게 됩니다. 지금까지 한번도 들어가보지 못했지만 http://localhost:8000/admin으로 접속하면 다음과 같이 로그인 페이지가 뜹니다.
우리는 계정을 만든 적이 없기 때문에 superuser를 먼저 등록해야 합니다. 다음의 명령을 수행합니다.
python manage.py createsuperuser
사용자 이름 (leave blank to use 'test'): admin
이메일 주소: test@test.com
Password: testdjango
Password (again): testdjango
이제 등록이 되었습니다. 이제 Fruit storages라고 우리가 만든 table이 보입니다. +추가를 눌러서 항목을 추가합니다.
apple과 banana를 추가해 보았습니다. 추가후 다시 test 페이지에 들어가보면 추가된 항목들이 다음과 같이 제대로 표시되는 것을 확인하실 수 있습니다.
샘플코드 : Link