[๐Ÿค Django] ํ”„๋กœ์ ํŠธ ์‹œ์ž‘๋‹จ๊ณ„ ์„ค์ •

์—ฌ์ฃผ๋งยท2020๋…„ 12์›” 4์ผ
0

Django

๋ชฉ๋ก ๋ณด๊ธฐ
2/4
post-thumbnail

[Django] intro์—์„œ ๋Œ€๋žต์ ์ธ ํฐ ํ‹€์„ ๋ณด๊ณ  ์ด๋ฒˆ์—๋Š” ์ง์ ‘ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•ด๋ณด๊ฒ ๋‹ค

0.๊ฐ€์ƒํ™˜๊ฒฝ(Virtual Environment) ๊ตฌ์ถ•ํ•˜๊ธฐ

์ฝ”๋ฆฐ์ด์ธ ๋‚˜๋Š” ๋‚ด ๋…ธํŠธ๋ถ์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐ”๋กœ ์‹œ์ž‘ํ•ด๋„ ๋˜์ง€๋งŒ, ์ˆ˜๋งŽ์€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‹ค๋ณด๋ฉด ํŠน์ • ๋ฒ„์ „์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค
ex) aํ”„๋กœ์ ํŠธ์—๋Š” ํŒŒ์ด์ฌ 3.8,๊ทผ๋ฐ bํ”„๋กœ์ ํŠธ๋Š” ํŒŒ์ด์ฌ 2๋ฒ„์ „์ด ํ•„์š”

๋ถ€์ž๋ผ๋ฉด ๋…ธํŠธ๋ถ 2๋Œ€ ๊ตฌ๋งคํ•˜๋ฉด ๋œ๋‹ค

์ด๋•Œ ๋“ฑ์žฅํ•˜๋Š”๊ฒŒ ๊ฐ€์ƒํ™˜๊ฒฝ์œผ๋กœ, ์šฐ๋ฆฌ์˜ ๋ฐ์Šคํฌํƒ‘์— ๊ฐ€์ƒ๊ณต๊ฐ„์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ฃผ๋Š”๊ฑธ ๋งํ•œ๋‹ค. ๊ฐ๊ฐ์˜ ํ”„๋กœ์ ํŠธ์— ๋งž๋Š” ํ™˜๊ฒฝ์œผ๋กœ ์…‹ํŒ…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

1. Project ์ƒ์„ฑ

$ django-admin startproject ํ”„๋กœ์ ํŠธ์ด๋ฆ„

์œ„์˜ ์ฝ”๋“œ๋Š” project๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  manage.py๋ฅผ ํฌํ•จ ์—ฌ๋Ÿฌ ํŒŒ์ผ๋“ค์„ ์ƒ์„ฑํ•ด ์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•˜์œ„์— ํ”„๋กœ์ ํŠธ์ด๋ฆ„๊ณผ ๋™์ผํ•œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ณ  ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ดˆ๊ธฐํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ค€๋‹ค.(์ฃผ์˜! (์ƒ์œ„ํŒŒ์ผ)ํ”„๋กœ์ ํŠธ์ด๋ฆ„-(ํ•˜์œ„ํŒŒ์ผ)ํ”„๋กœ์ ํŠธ์ด๋ฆ„์ด๋ ‡๊ฒŒ ๋‘๊ฐœ๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๋ฐ ์ƒ์œ„ ํ”„๋กœ์ ํŠธํŒŒ์ผ์€ ์ด๋ฆ„ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ํ•˜์œ„ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋ฉด ์•ˆ๋œ๋‹ค!)

2. app๋งŒ๋“ค๊ธฐ

$ python manage.py startapp ์•ฑ ์ด๋ฆ„

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ์˜ ํŒŒ์ผ๋“ค์ด default๋กœ ์ƒ์„ฑ๋œ๋‹ค.

  • migrations
  • init.py
  • admin.py
  • apps.py
  • models.py
  • views.py

3.Database์…‹์—…

setting.py -> 'INSTALLED APPS'

INSTALLED APPS๋ž€ stting.py์— ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ ๊ฐ์ฒด๋กœ์จ, ์ƒˆ๋กœ๋งŒ๋“  app์€ ์ด๊ณณ์— address๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ด์–ด์ง€๋„๋ก ์…‹ํŒ…ํ•ด์ค˜์•ผํ•œ๋‹ค.(์•ˆ๋˜๋ฉด ์—๋Ÿฌ...)
์ถ”๊ฐ€๋œ ์ˆœ์œผ๋กœ ์ œ์ผ ๋ฐ‘์— ์ˆœ์ฐจ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
์ฒซ๋ฒˆ์งธ ๊ฒฝ๋กœ์—๋Š” app์ด๋ฆ„, ๋‘๋ฒˆ์งธ ๊ฒฝ๋กœ๋Š” apps์ด๋‹ค (apps.py์— Config๊ฐ€ ๋“ค์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—)
๋งˆ์ง€๋ง‰ ๊ฒฝ๋กœ์˜ ์ด๋ฆ„์€ ๋””ํดํŠธ๋กœ ์นด๋ฉœํ˜•์‹์˜ app์ด๋ฆ„+Config์œผ๋กœ ๋งŒ๋“ค์–ด ์ง„๋‹ค.

@ settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'polls.apps.PollsConfig',      
]

์ถ”๊ฐ€ํ›„ shell์—์„œ ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ migrate๋ฅผ ํ•ด์ค€๋‹ค.(migrate๋Š” ๋‹ค์Œ๋‹จ๊ณ„์ธ Model๋งŒ๋“ค๊ธฐ์—์„œ๋„ ์‚ฌ์šฉ๋˜๋‹ˆ ์ž˜ ์•Œ์•„๋‘๋Š”๊ฑฐ ์ถ”์ฒœ~)

$ python manage.py migrate 

4.MODEL๋งŒ๋“ค๊ธฐ(model.py)

ํ”ํžˆ ๋ชจ๋ธ๋งํ•œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ.. Django๋กœ ๋ชจ๋ธ๋งํ•œ๋‹ค๋ฉด ์ด๊ฑฐ ์•„๋‹๊นŒ? ๋ผ๊ณ  ์ดํ•ดํ–ˆ๋‹ค

MODEL์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ์„ ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๊ทธ ๊ด€๋ จ๋œ ํŒŒ์ผ์€ models.py์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์žฅ์†Œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํ•„์ˆ˜์ ์ธ ์กด์žฌ์ด๋‹ค(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€์—†์œผ๋ฉด model.py๋„ ์†”์งํžˆ.. ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ๋ณธ๋‹ค) Django๋Š” ORM์ด๋ผ๋Š”๊ฑธ ํ†ตํ•ด ์‰ฝ๊ฒŒ model.py์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.(ORM์€ ๋‹ค์Œํฌ์ŠคํŒ…์—์„œ~)

  • ์ด๊ณณ์—์„œ class๋ฅผ ํ†ตํ•ด์„œ ์ •์˜๋ฅผ ํ•˜๋Š”๋ฐ, ์ด class๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ table์— ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํžˆ ๋„ฃ์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • modelclass์˜ instance๋Š” database์˜ ๊ฐ ํ•„๋“œ๋กœ ํ‘œํ˜„๋œ๋‹ค. ๊ฐ ํ•„๋“œ๊ฐ€ ๊ฐ€์งˆ ์ž๋ฃŒํ˜•์„ Django์— ์ „๋‹ฌํ•œ๋‹ค.
  • class์˜ ๊ฐ๊ฐ์˜ attribute๋Š” database์˜ column๋ช…์ด ๋œ๋‹ค
    if)models.py์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค? ํ™•์ธํ•˜๋ ค๋ฉด shell์„ ์žฌ์‹œ์ž‘ํ•ด์•ผํ•œ๋‹ค

5.MODEL์˜ ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ•˜๊ธฐ

makemigrations & migration

models.py๋ฅผ ๋ณ€๊ฒฝํ–ˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ์ž‘์—…์ด ํ•„์š”ํ•œ๋ฐ ์ด๋ฅผ migration์ด๋ผ๊ณ  ํ•œ๋‹ค. 3๋ฒˆ๋‹จ๊ณ„์—์„œ settings.py๋กœ ๋จผ์ € app์˜ address๋ฅผ ์„ธํŒ…ํ•ด์ค€๋‹ค.

  • makemigrations : ๋ชจ๋ธ์˜ ์ˆ˜์ •๋‚ด์šฉ์„ ์ ๊ฒ€ํ•˜์—ฌ, DB์˜ structure๋ฅผ ๋ฐ”๊พธ์–ด ์ค€๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ๋Š” migrate์ด ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ์ ๊ฒ€ํ•ด์ค€๋‹ค. (์‹ค์ œ migration์ด ์ผ์–ด๋‚˜์ง€๋Š” ์•Š์Œ)
  • migrate : ์‹ค์ œ๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•œ๋‹ค.
    migrations ๋””๋ ‰ํ† ๋ฆฌ์˜ initial.py์—์„œ ์ˆ˜๋™์œผ๋กœ ๋ณ€๊ฒฝ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

makemigrations,migrate๋ฅผ ํ•œ ๋‹จ๊ณ„๋กœ ์ƒ๊ฐํ•˜๊ณ  ๋งค๋ฒˆ ๊ฐ™์ด ํ•ด์ฃผ๋Š”๊ฑธ ์ถ”์ฒœ!

6. ๊ด€๋ฆฌ์ž ๊ณ„์ • ๋งŒ๋“ค๊ธฐ (admin.py)

๊ด€๋ฆฌ์ž ๊ณ„์ •์„ ์ƒ์„ฑํ•œ๋‹ค.

$  python manage.py createsuperuser   

์ƒˆ๋กœ ๋งŒ๋“  app์„ ๊ด€๋ฆฌ์ž ๊ณ„์ •์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค.

@admin.py
from .models import ์•ฑ์ด๋ฆ„
admin.site.register(์•ฑ์ด๋ฆ„)

7. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์ฒ˜๋ฆฌํ•˜๊ธฐ(views.py)

๋ฐ์ดํ„ฐ๋ฅผ MODEL์„œ ๊ฐ€์ ธ์™€ ๊ฐ€๊ณตํ•˜์—ฌ ์›นํŽ˜์ด์ง€ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค๋„๋ก ์ปจํŠธ๋กค ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
views.py์•ˆ์— ์žˆ๋Š” ํ•˜๋‚˜์˜ ํ•จ์ˆ˜->ํ•˜๋‚˜์˜ view๋ฅผ ์ •์˜ํ•œ๋‹ค.
views.py์‚ฌ์šฉ์˜ˆ์‹œ(์‹ค์ œ๋กœ ์ผ๋‹ค)

8. Database์— object๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ

migrationํ›„์— database์— ์ž๋ฃŒ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•, ํ•˜๋‚˜ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•˜๊ธฐ

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” objects์˜ ๋ฉ”์†Œ๋“œ๋“ค:
ํด๋ž˜์Šค์ด๋ฆ„.objects.all() : shows all objects in a given class
ํด๋ž˜์Šค์ด๋ฆ„.objects.filter(attribute__startswith="") : filter out objects starts with ""
ํด๋ž˜์Šค์ด๋ฆ„.objects.get(pk=1): get 1 object with a primary key 1.
.save() : save to DB

#python manage.py shell

from ์•ฑ์ด๋ฆ„.models import ํด๋ž˜์Šค1, ํด๋ž˜์Šค2

new_object = Class1()
new_object.attribute1 = ..
new_object.attribute2 = ..

๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•, ํ•œ๋ฒˆ์— ๋‹ค ์ถ”๊ฐ€ํ•˜๊ธฐ

  • ํด๋ž˜์Šค1 ๊ณผ ํด๋ž˜์Šค2๋ฅผ ForeignKey๋กœ ๋ฌถ์–ด์ค„ ๊ฒฝ์šฐ, ํด๋ž˜์Šค1์€ ํด๋ž˜์Šค2๋ฅผ set๋กœ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.
  • ํด๋ž˜์Šค1๊ฐ์ฒด.ํด๋ž˜์Šค2_set.all() ํด๋ž˜์Šค2 must be lowercase
  • ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ์ €์žฅ : ํด๋ž˜์Šค1๊ฐ์ฒด.ํด๋ž˜์Šค2_set.create(attribute = "")
>>> <QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Wecode>]>

# automatically saves to DB without using .save()
question1.choice_set.create(choice_text="coding")  
profile
๐ŸŒฑBackend Developer๐Ÿ‘ฉโ€๐Ÿ’ป

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด