Computer Science/BackEnd

점프 투 장고 #2 | 장고 URL, 뷰, ORM, 모델 익히기

토마토. 2022. 8. 13. 21:56

[참고] 2장 장고의 기본 요소 익히기! - 점프 투 장고 (wikidocs.net)

 

2장 장고의 기본 요소 익히기!

이 장에서는 장고 개발을 하는 데 필요한 기본 내용을 모두 다룰 것이다. 여러분이 앞으로 만들 '파이보'가 완성된 빌딩이라면 이 장은 기초 공사에 해당한다. 기초 공사를 탄 ...

wikidocs.net

예제로 배우는 파이썬 프로그래밍 - DB 설정과 Migration (pythonstudy.xyz)

URL과 뷰
  • urls.py
  • views.py
  • 장고의 개발 흐름
  • url 분리

 

장고  URL이란?

장고 URL을 만들어보자. 

장고 url에 원하는 url을 만들고, url에 일치하는 뷰를 연결해주는 것이다. 

views.py의 views 함수는 urls에서 view로 매핑해준다. 

 

로컬 호스트인 127.0.0.1:8000 에서 

파이보용 사이트인 127.0.0.1:8000/pybo 로 개발 중인 웹 사이트를 보기 위해서

urls.py에 pybo view와 매핑을 해주는 것이 필요하다. 

 

 

이를 위해 urls.py 파일에 pybo url 패턴을 추가해준다. 

 

<기존 urls.py>

from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]

장고에서 제공하는 admin url만 연결되어 있다. 

 

<urls.py에 pybo 추가>

from django.contrib import admin
from django.urls import path
from pybo import views


urlpatterns = [
    path('admin/', admin.site.urls),
    path('pybo/', views.index),
]

 

 

path('pybo/', views.index)

'pybo/' url에 views.index가 연결하기로 나와있기 때문에,

views.py 파일에 index 함수를 추가해주어야 한다. 

index 함수는 클라이언트로부터 pybo/ 요청 객체를 받으면, httpresponse 응답을 내놓는 역할을 한다. 

 

 

<index.py>

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.


def index(request):
    return HttpResponse("안녕하세요 pybo입니다.")

 

<그 결과>

 

이제 /pybo url이 활성화되었다. 

 

[recap] 장고의 개발 흐름

[1] 브라우저에서 서버로 127.0.0.1:8000/pybo 페이지를 요청(request)한다.

[2] urls.py에서 url 매핑을 확인하여 views.py의 index 함수를 호출한다. 

[3] index 함수가 httprequest 객체를 받아 httpresponse를 내놓아 브라우저에 반영한다! 

 

 

 

모델

 

장고의 모델이란?

장고의 모델은 일종의 객체라고 할 수 있다. 

장고는 데이터베이스에 모델을 이용해서 데이터를 저장한다. 

 

이를 장고의 ORM(Object Relational Mapping)이라고 한다.

장고의 객체(Object)에 관계형 데이터베이스(Relational Database)를 매핑해서

SQL 없이 모델 개념만 가지고 데이터 작업을 할 수 있다. 

 

장고는 데이터베이스 엔진으로 SQLite를 사용한다. SQLite는 소규모 프로젝트에서 주로 사용하는 가벼운 데이터베이스다. 

 

현재 진행 중인 프로젝트의 데이터베이스를 보기 위해 'DB Browser for SQLite'를 설치해보자. 

Downloads - DB Browser for SQLite (sqlitebrowser.org)

 

모델 작성하기

질의응답 사이트인 파이보에 데이터 모델을 만들어보자.

데이터 모델에는 질문과 대답이 필요하다.

일단 Question 모델과 Answer 모델을 만들고, 

Question 모델에는 subject, content, create_date 속성을, 

Answer 모델은 question, content, create_date 속성을 만들어주자. 

 

<이를 models.py에 정의해준다>

from django.db import models

# Create your models here.
class Question(models.Model):
    subject = models.CharField(max_length=200)
    content = models.TextField()
    create_date = models.DateTimeField()

class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    content = models.TextField()
    create_date = models.DateTimeField()

참고로 Answer 클래스의 question에 있는 'on_delete=models.CASCADE'는

Answer.question에 연결된 Question이 삭제될 경우 연결된 Answer 객체도 삭제된다는 뜻이다. 

 

테이블 생성하기
  • step 1. 파이보 앱을 추가한다. 

config 폴더의 settings.py의 INSTALLED_APPS 항목에 파이보 앱을 추가한다. 

 

  • step 2. 모델 변화를 DB에 적용하기

모델에 변화가 있으므로 makemigrations 이후에 migrate 명령까지 수행해준다. 

이때 makemigrations 명령은 장고가 테이블 작업을 수행하기 위한 작업 파일을 생성하는 것이며, 

migrate 명령은 테이블을 생성하거나 수정하는 것을 DB에 적용하는 명령어이다.

 

$ python manage.py makemigrations
Migrations for 'pybo':
  pybo/migrations/0001_initial.py
    - Create model Question
    - Create model Answer
(JumpToDjango) $ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, pybo, sessions
Running migrations:
  Applying pybo.0001_initial... OK

 

  • sqlmigrate

sqlmigrate 명령어를 통해 실행 가능한 SQL 명령어를 살펴볼 수 있다. 

$ python manage.py sqlmigrate pybo 0001
BEGIN;
--
-- Create model Question
--
CREATE TABLE "pybo_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "subject" varchar(200) NOT NULL, "content" text NOT NULL, "create_date" datetime NOT NULL);
--
-- Create model Answer
--
CREATE TABLE "pybo_answer" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "content" text NOT NULL, "create_date" datetime NOT NULL, "question_id" bigint NOT NULL REFERENCES "pybo_question" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "pybo_answer_question_id_e174c39f" ON "pybo_answer" ("question_id");COMMIT;

 

모델 사용하기

장고 쉘을 python manage.py shell로 실행해준다. 

$ python manage.py shell
Python 3.8.10 (default, Jun 22 2022, 20:18:18) 
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

실행된 인터렉티브 콘솔에서 모델을 사용할 수 있다. 

 

장고(django)의 ORM(Object-Relational Mapping)을 사용하여

데이터를 생성하고 읽고 갱신하고 삭제할(CRUD - Create Read Update Delete) 수 있다. 

 

  • [CREATE] Question 생성
>>> from pybo.models import Question, Answer
>>> from django.utils import timezone
>>> q = Question(subject='pybo는 무엇인가요?', content='pybo에 대해서 알고 싶습
니다.', create_date=timezone.now())
>>> q.save
<bound method Model.save of <Question: Question object (None)>>

Question 모델을 불러온 뒤에,

subject, content, create_date의 형식을 맞추어 Question 객체를 생성해준다. 

 

>>> q.save()
>>> q.id
1

객체.save() 매소드를 통해 생성된 상태를 저장할 수 있으며, 

이 객체에 대한 id가 부여된다. 

 

  • [READ] Question 조회
Question.objects.all()
<QuerySet [<Question: Question object (1)>, <Question: Question object (2)>]>
>>>

Question.objects를 통해서 모델의 데이터를 조회할 수 있다. 

Question object (1) 에서 1은 model의 id를 의미한다. 

 

 Question.objects.filter(id=1)
<QuerySet [<Question: pybo는 무엇인가요?>]>

모델명.objects.filter()을 걸어서 데이터를 조회할 수 있다. 

조건을 걸어서 Question 데이터 조회하는 방식이다. 

 

>>> Question.objects.get(id=1)
<Question: pybo는 무엇인가요?>

모델명.objects.get()으로는 유일한 값인 것을 조회할 수 있다. 

 

이때 객체 리스트가 아니라 Question 모델 객체 자체가 리턴된다.

 

>>> Question.objects.filter(subject__contains='pybo')
<QuerySet [<Question: pybo는 무엇인가요?>, <Question: pybo 알려주세요>]>

 

  • [UPDATE] Question 수정
>>> q = Question.objects.get(id=2)
>>> q
<Question: pybo 알려주세요>
>>> q.subject = '장고를 수정하는 방법입니다.'
>>> q.save()
>>> q
<Question: 장고를 수정하는 방법입니다.>

바로 대입해주면 객체의 내용이 수정된다. 

 

  • [DELETE] Question 삭제
>>> q = Question.objects.get(id=1)
>>> q.delete()
(1, {'pybo.Question': 1})
>>> Question.objects.all()
<QuerySet [<Question: 장고를 수정하는 방법입니다.>]>