๐Ÿฅž BE
home

3. Model & Admin

Date
2022/12/19
Category
Web
Tag
Django
Detail
Likelion Study

Model

template์ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋Š” ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•œ๋‹ค๋ฉด model์€ ๊ทธ ํ™”๋ฉด ๊ตฌ์„ฑ์„ ์ฑ„์šฐ๋Š” ๋‚ด์šฉ๋ฌผ์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(DB)๋ผ๋Š” ๊ฒƒ์ด ์ด model์„ ์˜๋ฏธํ•œ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ํŠน์ • ์‚ฌ์ดํŠธ์— ํšŒ์›๊ฐ€์ž…์„ ํ•˜๊ฑฐ๋‚˜, ๊ธ€์„ ์“ฐ๊ฒŒ๋˜๋ฉด ๊ทธ ์ •๋ณด๋Š” ์„œ๋ฒ„์ปดํ“จํ„ฐ์˜ DB์— ์ €์žฅ์ด ๋˜๊ณ , ์ด DB์— ์ €์žฅ๋œ ๋‚ด์šฉ์€ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋”ฐ๋ผ view๋ฅผ ํ†ตํ•ด ๊ฐ€๊ณต๋˜์–ด template์— ๋ณด์—ฌ์ง€๊ฒŒ ๋œ๋‹ค.
(๋ฐ์ดํ„ฐ๋ฅผ ์Œ“์•„๋‘๊ณ  ์žˆ๋‹ค๊ฐ€ ํ•„์š”ํ• ๋•Œ ๊บผ๋‚ด์ฃผ๋Š” ๊ณณ์ด๋‹ค.)
์ถ”ํ›„ ๋งŒ๋“ค ๋ธ”๋กœ๊ทธ ํŽ˜์ด์ง€๋ฅผ ์œ„ํ•ด ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

project ์‹œ์ž‘ํ•˜๊ธฐ

django-admin startproject secondproject
Bash
๋ณต์‚ฌ
python manage.py startapp blog
Bash
๋ณต์‚ฌ

model ๋งŒ๋“ค๊ธฐ

model์€ ์ผ์ข…์˜ ์—‘์…€ํ‘œ์™€ ๋น„์Šทํ•˜๋‹ค. ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€์„ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋‚ด์šฉ์ด ๋ญ๊ฐ€ ์žˆ์„๊นŒ ์ƒ๊ฐํ•ด๋ณด์ž. ์—ฌ๋Ÿฌ๊ฐœ ๋“ค์–ด๊ฐ€๋ฉด ์ •์‹ ์—†์œผ๋‹ˆ ์•„๋ž˜ 3๊ฐœ๋งŒ ๋„ฃ์–ด์„œ model์„ ๋งŒ๋“ค์–ด๋ณธ๋‹ค.
โ€ข
์ œ๋ชฉ
โ€ข
๋ณธ๋ฌธ
โ€ข
์ž‘์„ฑ์ผ์ž
blog์™€ ๊ด€๋ จ๋œ model์„ ์ž‘์„ฑํ•˜๋Š” ๊ฑฐ๋‹ˆ๊นŒ blog ํด๋” ๋‚ด์— model์„ ์—ฐ๋‹ค.
class ๋ช…์„ ์ง€์„๋•Œ์—๋Š” ๊ผญ ์ฒซ๊ธ€์ž๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ์ง€์–ด์•ผํ•œ๋‹ค. ์ด๊ฑด ๊ฐœ๋ฐœ์ž ๊ฐ„์˜ ์•ฝ์†(?) ๊ฐ™์€ ๊ฑฐ๋‹ค.
class Blog(models.Model): title = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') body = models.TextField()
Python
๋ณต์‚ฌ
title,pub_date,body๋Š” ๋ชจ๋ธ์˜ ์†์„ฑ๋“ค์ด๋‹ค.
์†์„ฑ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ฒŒ์‹œ๊ธ€์„ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋‚ด์šฉ๋“ค์„ ์˜๋ฏธํ•˜๋ฉฐ, ์šฐ๋ฆฌ๋Š” ์ด ํ•„์š”ํ•œ ๋‚ด์šฉ๋“ค์ด ์–ด๋–ค ๋ชจ์–‘์œผ๋กœ ํ˜•์„ฑ๋ ์ง€ ์•Œ๋ ค์ค˜์•ผํ•œ๋‹ค.
1.
title ์†์„ฑ์€ ์ตœ๋Œ€ length๊ฐ€ 200์ธ ๋ฌธ์ž์—ด๋กœ ํ˜•์„ฑํ• ๊ฑฐ์•ผ.
2.
pub_date ์†์„ฑ์€ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์œผ๋กœ ํ˜•์„ฑํ• ๊ฑฐ์•ผ.
3.
body ์†์„ฑ์€ ๊ธด ๋ฌธ์ž์—ด์œผ๋กœ ํ˜•์„ฑํ• ๊ฑฐ์•ผ.
์œ„์™€ ๊ฐ™์ด model์„ ์ž‘์„ฑํ–ˆ์œผ๋ฉด ์ด์ œ python manage.py๋กœ ์ถ”๊ฐ€์ ์ธ ๋ช…๋ น์„ ๋‚ด๋ ค์ค˜์•ผ ํ•œ๋‹ค. ์ด๊ฑด ๊ธฐ์–ตํ•˜๊ณ  ๊ฐ€์ž. model์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉดโ€ฆ
1.
models.py์—์„œ ์ฝ”๋“œ ์ž‘์„ฑ
2.
python manage.py makemigrations ์„ ํ†ตํ•ด migration ๋งŒ๋“ค๊ธฐ
3.
python manage.py migrate ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉํ•˜๊ธฐ
model์„ ๋งŒ๋“ค๋ ค๋ฉด ์œ„์˜ 3๊ฐ€์ง€ ์ž‘์—…์„ ๊ผญ ํ•ด์•ผํ•œ๋‹ค.
์ด์ œ 2, 3 ๋ฒˆ ์ž‘์—…์„ ํ•ด๋ณด์ž.
python manage.py makemigrations
Bash
๋ณต์‚ฌ
migration์„ ๋งŒ๋“œ๋Š” ๋ช…๋ น์–ด.
migration์ด๋ž€?
python manage.py migrate
Bash
๋ณต์‚ฌ
์ž‘์„ฑํ•œ ๋ชจ๋ธ์„ DB์— ์ ์šฉ์‹œํ‚ค๋Š” ๋ช…๋ น์–ด.
์ด๋Ÿผ ์–ด์ฐŒ์ €์ฐŒ model์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.
์ด์ œ ์ž˜ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ํ™•์ธ์„ ํ•ด์•ผํ•œ๋‹ค. ๋ฐ”๋กœ ๊ฒŒ์‹œ๊ธ€์„ ์ง์ ‘ ๋“ฑ๋กํ•ด๋ณด๋Š” ๊ฒƒ. ์ด๋Ÿด๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๋‹ค. ๋ฐ”๋กœ adminํŽ˜์ด์ง€์ด๋‹ค.

admin ํŽ˜์ด์ง€

admin ํŽ˜์ด์ง€๋Š” ์‚ฌ์ดํŠธ ๊ด€๋ฆฌ์ž๊ฐ€ ์ปจํ…์ธ ๋ฅผ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ†ตํ•ฉ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋ฌผ๋ก  ์‚ฌ์šฉ ๋ชฉ์ ์— ๋”ฐ๋ผ ์ˆ˜์ •ํ•ด์•ผํ•  ์ผ์ด ๋‹ค๋ถ„ํ•˜์ง€๋งŒ, ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์–ด๋””์ธ๊ฐ€.
127.0.0.1/admin ์œผ๋กœ ์ ‘์†ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋œฌ๋‹ค.
๋กœ๊ทธ์ธ์„ ํ•ด์•ผํ•˜๋Š”๋ฐ ๋กœ๊ทธ์ธ ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. ์•„์ด๋””๋‚˜ ๋น„๋ฒˆ๊ฐ™์€๊ฑธ ๋งŒ๋“  ์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ. ์•„์ด๋””๋ฅผ ๋งŒ๋“ค์–ด ์ ‘์†์„ ํ•ด๋ณด์ž.

admin ๋งŒ๋“ค๊ธฐ

python manage.py createsuperuser
Bash
๋ณต์‚ฌ
admin์„ ๋งŒ๋“œ๋Š” ๋ช…๋ น์€ createsuperuser์ด๋‹ค. ์Šˆํผ์œ ์ €๋ฅผ ๋งŒ๋“ค๋ผ๊ณ  ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋ฉด ์•„์ด๋””์™€ ์ด๋ฉ”์ผ์ฃผ์†Œ, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋‚ด์šฉ์ด ํ„ฐ๋ฏธ๋„์— ๋‚˜์˜จ๋‹ค.
์ž‘์„ฑ ํ›„ ๋งŒ๋“ค์–ด์ง„ ๊ณ„์ •์„ ๊ฐ€์ง€๊ณ  ์›นํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐ€ ๋กœ๊ทธ์ธ ํ•ด๋ณด์ž.
์•„๊นŒ ๋งŒ๋“  model์„ ํ™•์ธํ•˜๋ ค๊ณ  adminํŽ˜์ด์ง€์— ๋“ค์–ด์™”๋Š”๋ฐ.. blog๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. ์™œ๋ƒํ•˜๋ฉด django์—๊ฒŒ๋Š” ์šฐ๋ฆฌ๊ฐ€ model์„ ๋งŒ๋“ค์—ˆ๋‹ค๋Š” ๊ฑธ migrate๋ฅผ ํ†ตํ•ด ์•Œ๋ ธ์ง€๋งŒ, admin์—๊ฒŒ๋Š” ์•Œ๋ ค์ฃผ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

admin์— model ๋“ฑ๋กํ•˜๊ธฐ

blog ํด๋” ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด admin.py๋ผ๋Š” ํŒŒ์ผ์ด ์žˆ๋‹ค. ์•ˆ์— ๋‘ ์ค„์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.
from .models import Blog # Register your models here. admin.site.register(Blog)
Python
๋ณต์‚ฌ
์ฒซ์งธ์ค„์€ ๊ฐ™์€ ํด๋”์œ„์น˜์— ์žˆ๋Š” models ๋ผ๋Š” ํŒŒ์ผ์—, Blog ๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๋ผ๋Š” ์†Œ๋ฆฌ๊ณ , ๋งจ ๋ฐ‘์— ์ค„์€ admin์ด๋ผ๋Š” site์— Blog ๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋“ฑ๋กํ•˜๋ผ๋Š” ๋ง์ด๋‹ค.
์ด๋Ÿฌ๊ณ  ์ƒˆ๋กœ ๊ณ ์นจ์„ ํ•ด๋ณด๋ฉด,
๋ธ”๋กœ๊ทธ๊ฐ€ ์ƒ๊ธด๋‹ค.
add Blog ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋‹ค์Œ์™€ ๊ฐ™์€ ๊ฒŒ์‹œ๊ธ€ ์ž…๋ ฅ ํ™”๋ฉด์ด ๋œฌ๋‹ค. title, Date publiched, body๋ผ๋Š” ์•„๊นŒ ์ง์ ‘ ์ž‘์„ฑํ–ˆ๋˜ ๋‚ด์šฉ๋“ค์ด๋‹ค.
models.py์— ์ ์—ˆ๋˜ ๋‚ด์šฉ๋“ค์ด admin ํŽ˜์ด์ง€์—์„œ add blog ํŽ˜์ด์ง€์˜ ์–‘์‹์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

blog ๋ชจ๋ธ์— ๊ธ€ ์ž‘์„ฑํ•ด๋ณด๊ธฐ

์ฒซ ๊ธ€์„ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค.

๊ธ€ ์ œ๋ชฉ ํ‘œ์‹œํ•˜๊ธฐ

ํ•ด๋‹น ๊ธ€ ๋ชฉ๋ก์—์„œ Blog object (1)์ด ์•„๋‹Œ ๊ธ€ ์ œ๋ชฉ์„ ํ‘œ์‹œํ•˜๊ณ  ์‹ถ๋‹ค.
class Blog(models.Model): title = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') body = models.TextField() def __str__(self): return self.title
Python
๋ณต์‚ฌ
โ€œ__str__โ€ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๊ธ€ ์ œ๋ชฉ์ด ํ‘œ์‹œ๋œ๋‹ค.

์ฟผ๋ฆฌ์…‹๊ณผ ๋ฉ”์†Œ๋“œ

view๋กœ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

model์„ ์ง์ ‘ ๋งŒ๋“ค๊ณ  admin ํŽ˜์ด์ง€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋“ฑ๋กํ–ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด์ œ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค˜์•ผํ•œ๋‹ค.
from django.shortcuts import render from .models import Blog # Create your views here. def home(request): blogs = Blog.objects # ์ฟผ๋ฆฌ์…‹ # ๋ฉ”์†Œ๋“œ return render(request, 'home.html', {'blogs': blogs})
Python
๋ณต์‚ฌ
๋จผ์ € Blog๋ฅผ import ํ•ด์ฃผ๊ณ , Blog.objects๋ฅผ blogs ๋ผ๋Š” ๋ณ€์ˆ˜์—๋‹ค๊ฐ€ ๋„ฃ์–ด์ค€๋‹ค.
Blog.objects๋Š” ์•„๊นŒ admin ํŽ˜์ด์ง€์—์„œ ํ™•์ธํ–ˆ๋˜ blog ์•ˆ์˜ ๋ฐ์ดํ„ฐ๋“ค์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋ชจ๋ธ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ์ฒด๋ชฉ๋ก์„ ์šฐ๋ฆฌ๋Š” queryset์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ์ฟผ๋ฆฌ์…‹๋“ค์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฉ”์†Œ๋“œ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
render์—์„œ๋Š” ์‚ฌ์ „ํ˜• ์ž๋ฃŒํ˜•์ธ {'blogs': blogs} ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ, blogs๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ template์—์„œ ์“ธ๋•Œ blogs๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ฒ ๋‹ค๊ณ  ๋ช…๋ช…ํ•˜๋Š” ์ž‘์—…์ด๋‹ค.
์ด์ œ temlplate์— blog ๋ชจ๋ธ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•ด๋ณด์ž. view์—์„œ ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ template์—์„œ ๋ณด์—ฌ์ฃผ๋ ค๋ฉด..?
์ง€๋‚œ๋ฒˆ ๋ฐฐ์šด{{ }}๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
์ผ๋‹จ {{ blogs }}๋ฅผ ์ ์–ด๋ณด์ž.
์ด๋Ÿฐ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค. ๋ญ”๊ฐ€ ์—ฐ๊ฒฐ๋œ ๊ฒƒ ๊ฐ™๊ธด ํ•˜๋‹ค.
์ด๋ฒˆ์—” {{ blogs.all }}์„ ์ ์–ด๋ณด์ž.
์ด๋Ÿฐ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค. ๋‚ด๊ฐ€ ์จ๋†“์€ ๊ธ€์˜ ์ œ๋ชฉ ๋ชฉ๋ก๋“ค์ด ๋ชจ๋‘ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.
template์—์„œ ๊ฐ€์ ธ์˜จ blogs๋Š” list ํ˜•์‹์œผ๋กœ ๋„˜์–ด์˜จ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๋งž๊ฒŒ ์ž˜๋ผ์„œ template์— ํ•„์š”ํ•œ ๋ถ€๋ถ„๋ถ€๋ถ„์— ๋ฟŒ๋ ค์ฃผ๋ฉด ๋œ๋‹ค.
Blog์˜ title๊ณผ body, pub_date๋ฅผ template์— ๋ฐฐ์น˜ํ•ด๋ณด์ž.
{% for blog in blogs.all %} <h1> {{blog.title}} </h1> <p> {{blog.pub_date}} </p> <p> {{blog.body}} </p> <br><br> {% endfor %}
HTML
๋ณต์‚ฌ
html์— ์œ„์˜ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ด์ฃผ๊ณ  ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค. ๊ธ€์„ ์ถ”๊ฐ€์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์•„๋ž˜์— ์ƒˆ๋กœ์šด ๊ธ€์ด ๊ณ„์† ์ถ”๊ฐ€๋œ๋‹ค.
๊ธ€์„ ๋ช‡ ๊ฐœ ๋” ์จ๋ณด๋ฉด,
๋‹น์—ฐํ•˜๊ฒŒ๋„ ์ž˜ ๋‚˜์˜จ๋‹ค.
model์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๊ทธ๊ฑธ view๋ฅผ ํ†ตํ•ด template์— ๋ณด์—ฌ์ฃผ๋Š” ์ž‘์—…๊นŒ์ง€ ํ•ด๋ƒˆ๋‹ค.
์ฒ˜์Œ html ํŒŒ์ผ์— ํ…œํ”Œ๋ฆฟ ๋ณ€์ˆ˜๋กœ์จ ์ž‘์„ฑํ–ˆ๋˜ {{ blogs }}๋Š” ๋ฆฌ์ŠคํŠธ ํ˜•์‹์˜ ์ฟผ๋ฆฌ์…‹ ๊ฐ์ฒด์ด๋‹ค.
์šฐ๋ฆฌ๋Š” ์ด ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , {{ blogs.all() }} ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด ๊ฐ์ฒด์— ์žˆ๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ์…‹์„ ๊ฐ€์ ธ์™€ ์ถœ๋ ฅํ–ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ๊ฐ์ฒด๋ฅผ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ์ด์šฉํ•  ๋•Œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฉ”์†Œ๋“œ๋ผ๊ณ  ํ•œ๋‹ค.
๊ฐ์ฒด.count(), ๊ฐ์ฒด.first(), ๊ฐ์ฒด.last() ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์œผ๋‹ˆ, ๋‹ค์–‘ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌ๊ธ€๋งํ•ด๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.