안녕하세요
이번 시간에는 Django ORM에 대해 알아보고 POST 방식을 이용해서 데이터베이스에 저장하는 실습을 진행하겠습니다.
1. Django ORM 이란?
Django ORM(Object-Relational Mapping)은 Django에서 제공하는 데이터베이스 추상화 라이브러리로, 객체 지향 프로그래밍 언어인 파이썬과 관계형 데이터베이스 간의 매핑을 담당합니다. ORM을 사용하면 SQL 쿼리를 직접 작성하지 않고도 파이썬 코드로 데이터베이스를 다룰 수 있으므로, 개발자는 데이터베이스에 대한 복잡한 로우 레벨의 조작 없이 객체 지향적인 코드를 작성할 수 있습니다.
2. Django ORM의 장점 (사용하는 이유)
Django ORM의 장점은 다음과 같습니다.
1. 생산성 향상
ORM을 사용하면 SQL 쿼리를 직접 작성하지 않아도 되므로, 개발자는 데이터베이스를 다루는 데 더 많은 시간을 할애할 수 있습니다. 또한 ORM을 사용하면 데이터베이스와 상호작용하는 코드를 더욱 직관적으로 작성할 수 있으므로, 개발 시간이 단축됩니다.
2. 유지보수성 향상
ORM을 사용하면 데이터베이스와 상호작용하는 코드를 객체 지향적으로 작성할 수 있으므로, 코드의 가독성과 유지보수성이 향상됩니다.
3. 데이터베이스 이식성 향상
ORM을 사용하면 데이터베이스 간의 차이점을 최소화하므로, 데이터베이스를 변경하더라도 코드 수정이 최소화됩니다.
4. 보안성 향상
ORM을 사용하면 SQL 쿼리를 직접 작성하지 않아도 되므로, SQL 인젝션 공격을 방지할 수 있습니다.
5. 테스트에 용이
ORM을 사용하면 데이터베이스와의 상호작용이 객체 지향적으로 작성되므로, 유닛 테스트 등에서 테스트가 용이해집니다.
Django ORM은 개발자가 데이터베이스를 다루는 데 있어서 생산성과 유지보수성을 향상시키는 매우 유용한 라이브러리입니다.
3. 사전 준비하기 (템플릿 확장, Bootstrap4)
[Django] Django에서 템플릿 확장의 개념과 템플릿 확장 적용하는 방법 실습하기 (tistory.com)
[Django] Bootstrap4에 대해 알아보고 Django에 Bootstrap4 부트스트랩 적용하기 (tistory.com)
실습을 진행하기 앞서 개발 환경을 맞추고자 Django 템플릿 확장과 Bootstrap4를 적용해야 합니다.
4. Django ORM과 POST 방식을 이용하여 데이터베이스에 저장하기
1. models.py 파일에서 모델 정의하기
# models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=50)
text = models.TextField()
def __str__(self):
return self.text
다음과 같이 Django models를 이용해 Post라는 모델을 작성합니다.
2. 템플릿 작성하기
<!-- post_list.html -->
{% extends 'base.html' %}
{% load bootstrap4 %}
{% block content %}
<form method="post">
{% csrf_token %}
<input type="text" name="text">
<button type="submit" class="btn btn-primary">POST</button>
</form>
<h2>{{ post }}</h2>
{% endblock %}
Forms.py에서 폼을 만들어주어도 괜찮으나 저는 템플릿에 직접 폼을 만들겠습니다.
3. Views 파일에서 Django ORM을 이용해 POST 요청 처리하기
# views.py
from django.shortcuts import render, redirect
from .models import Post
def post(request):
if request.method == 'POST':
post = Post()
post.text = request.POST['text']
post.save()
return redirect('post')
else:
post = Post.objects.all()
return render(request, 'post_list.html', {'post':post})
(1) if request.method == 'POST':
만약 요청 메서드가 POST인 경우
(2) post = Post()
새로운 Post 객체를 생성합니다.
(3) post.text = request.POST['text']
Post 객체의 text 속성에 요청 메시지의 'text' 키 값에 해당하는 값을 할당합니다.
(4) post.save() # Django ORM 사용
새로 생성된 Post 객체를 [데이터베이스에 저장]합니다.
(5) return redirect('post')
post라는 이름의 URL 패턴으로 리디렉션합니다.
(6) else:
요청 메서드가 POST가 아닌 경우
(7) post = Post.objects.all() # Django ORM 사용
모든 Post 객체를 데이터베이스에서 가져와 post 변수에 할당합니다.
(8) return render(request, 'post_list.html', {'post':post})
post_list.html 템플릿을 렌더링하고, post 변수를 템플릿에 전달합니다.
4. URLconf에 매핑하기
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.post, name='post'),
]
다음과 같이 URLconf를 통해 Views에서 정의한 post 함수와 매핑합니다.
5. 서버 실행하기
python manage.py runserver
"안녕"을 입력하고 POST를 누르니까 QuerySet이라는 곳에 저희가 입력했던 내용들이 출력되는 게 보이시나요?
Django ORM을 통해 모든 객체를 조회하고 있기 때문에 Post 모델에 있던 text라는 필드의 모든 내용을 조회해서 출력해 준 것입니다. 하지만 objects.all()을 이용하면 쿼리 셋 형태로 보입니다.
1. objects.get() 함수 이용하기
# views.py
from django.shortcuts import render, redirect
from .models import Post
def post(request):
if request.method == 'POST':
post = Post()
post.text = request.POST['text']
post.save()
return redirect('post')
else:
post = Post.objects.get(id=1)
return render(request, 'post_list.html', {'post':post})
post = Post.objects.get(id=1)
get() 메서드는 쿼리 셋이 아닌 모델 객체를 반환하는 함수입니다 특정 칼럼 조건에 해당하는 결과를 객체로 반환하는 함수로 찾는 결과가 없으면 DoesNotExist 예외를 발생시킵니다.
get() 메서드를 쓸 때는 예외가 발생하기 때문에 try-except 구문을 통해 예외 처리를 해주어야 합니다.
모델에서 따로 pk(primary key) 기본 키를 지정하지 않으면 Django에서는 기본적으로 pk 값을 순서대로 부여합니다.
2. objects.get() 확인하기
아까 objects.all() ORM을 사용할 때는 Query Set 형태로 출력되었는데 이번에는 쿼리 셋 안에 첫 번째 인자가 출력되는 모습입니다.
3. objects.get()을 사용하였는데 매칭되는 쿼리가 없을 때
다음과 같이 DoesNotExist 에러가 발생하고 matching query does not exist라는 메세지를 던져줍니다.
이번 시간에는 Django ORM에 대해 알아보고 ORM과 POST를 이용하여 데이터베이스에 저장하는 간단한 실습을 진행했습니다.
감사합니다.
'Framework > Django' 카테고리의 다른 글
[Django] Django 게시판 구현하기(1) Create (0) | 2021.02.08 |
---|---|
[Django] Django-MySQL 연동하는 방법과 MySQL Workbench 사용 실습하기 (0) | 2021.02.08 |
[Django] Django에서 GET, POST 방식에 대해 알아보고 간단한 실습하기 (0) | 2021.01.30 |
[Django] Bootstrap4에 대해 알아보고 Django에 Bootstrap4 부트스트랩 적용하기 (0) | 2021.01.30 |
[Django] Django MTV(Model-View-Controller) 디자인 패턴 알아보기 (0) | 2021.01.30 |
클라우드, 개발, 자격증, 취업 정보 등 IT 정보 공간
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!