[Django] intro์์ ๋๋ต์ ์ธ ํฐ ํ์ ๋ณด๊ณ ์ด๋ฒ์๋ ์ง์ ํ๊ฒฝ์ ์ค์ ํด๋ณด๊ฒ ๋ค
์ฝ๋ฆฐ์ด์ธ ๋๋ ๋ด ๋
ธํธ๋ถ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๋ฐ๋ก ์์ํด๋ ๋์ง๋ง, ์๋ง์ ํ๋ก์ ํธ๋ฅผ ํ๋ค๋ณด๋ฉด ํน์ ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค
ex) aํ๋ก์ ํธ์๋ ํ์ด์ฌ 3.8,๊ทผ๋ฐ bํ๋ก์ ํธ๋ ํ์ด์ฌ 2๋ฒ์ ์ด ํ์
๋ถ์๋ผ๋ฉด ๋
ธํธ๋ถ 2๋ ๊ตฌ๋งคํ๋ฉด ๋๋ค
์ด๋ ๋ฑ์ฅํ๋๊ฒ ๊ฐ์ํ๊ฒฝ์ผ๋ก, ์ฐ๋ฆฌ์ ๋ฐ์คํฌํ์ ๊ฐ์๊ณต๊ฐ์ ํ๋ ๋ง๋ค์ด์ฃผ๋๊ฑธ ๋งํ๋ค. ๊ฐ๊ฐ์ ํ๋ก์ ํธ์ ๋ง๋ ํ๊ฒฝ์ผ๋ก ์ ํ ์ ํ ์ ์๋ค.
์์ ์ฝ๋๋ project๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ manage.py๋ฅผ ํฌํจ ์ฌ๋ฌ ํ์ผ๋ค์ ์์ฑํด ์ค๋ค. ๊ทธ๋ฆฌ๊ณ ํ์์ ํ๋ก์ ํธ์ด๋ฆ๊ณผ ๋์ผํ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋ด๊ณ ๋์์ ์ฌ๋ฌ ์ด๊ธฐํ์ผ์ ๋ง๋ค์ด ์ค๋ค.(์ฃผ์! (์์ํ์ผ)ํ๋ก์ ํธ์ด๋ฆ-(ํ์ํ์ผ)ํ๋ก์ ํธ์ด๋ฆ
์ด๋ ๊ฒ ๋๊ฐ๊ฐ ์์ฑ๋๋๋ฐ ์์ ํ๋ก์ ํธํ์ผ์ ์ด๋ฆ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ์ง๋ง, ํ์ํ๋ก์ ํธ ์ด๋ฆ์ ๋ฐ๊พธ๋ฉด ์๋๋ค!)
์์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ค์์ ํ์ผ๋ค์ด default๋ก ์์ฑ๋๋ค.
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
ํํ ๋ชจ๋ธ๋งํ๋ค๊ณ ํ๋๋ฐ.. Django๋ก ๋ชจ๋ธ๋งํ๋ค๋ฉด ์ด๊ฑฐ ์๋๊น? ๋ผ๊ณ ์ดํดํ๋ค
MODEL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ์ ํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์ค๋ ์ญํ ์ ํ๋ค. ๊ทธ ๊ด๋ จ๋ ํ์ผ์ models.py
์ด๋ค. ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ฅ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ฏ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํ์์ ์ธ ์กด์ฌ์ด๋ค(๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ์์ผ๋ฉด model.py๋ ์์งํ.. ์๋ฏธ๊ฐ ์๋ค๊ณ ๋ณธ๋ค) Django๋ ORM์ด๋ผ๋๊ฑธ ํตํด ์ฝ๊ฒ model.py์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌ ํ ์ ์๋ค.(ORM์ ๋ค์ํฌ์คํ
์์~)
model
class์ instance๋ database
์ ๊ฐ ํ๋๋ก ํํ๋๋ค. ๊ฐ ํ๋๊ฐ ๊ฐ์ง ์๋ฃํ์ Django์ ์ ๋ฌํ๋ค.database
์ column๋ช
์ด ๋๋คmodels.py๋ฅผ ๋ณ๊ฒฝํ์ผ๋ฏ๋ก, ์ด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ๊ธฐ ์ํ์ฌ ์์
์ด ํ์ํ๋ฐ ์ด๋ฅผ migration
์ด๋ผ๊ณ ํ๋ค. 3๋ฒ๋จ๊ณ์์ settings.py๋ก ๋จผ์ app์ address๋ฅผ ์ธํ
ํด์ค๋ค.
makemigrations,migrate๋ฅผ ํ ๋จ๊ณ๋ก ์๊ฐํ๊ณ ๋งค๋ฒ ๊ฐ์ด ํด์ฃผ๋๊ฑธ ์ถ์ฒ!
๊ด๋ฆฌ์ ๊ณ์ ์ ์์ฑํ๋ค.
$ python manage.py createsuperuser
์๋ก ๋ง๋ app์ ๊ด๋ฆฌ์ ๊ณ์ ์์ ๊ด๋ฆฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ด ์ค์ ์ด ํ์ํ๋ค.
@admin.py
from .models import ์ฑ์ด๋ฆ
admin.site.register(์ฑ์ด๋ฆ)
๋ฐ์ดํฐ๋ฅผ MODEL์ ๊ฐ์ ธ์ ๊ฐ๊ณตํ์ฌ ์นํ์ด์ง ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค๋๋ก ์ปจํธ๋กค ํ๋ ์ญํ ์ ํ๋ค.
views.py์์ ์๋ ํ๋์ ํจ์->ํ๋์ view๋ฅผ ์ ์ํ๋ค.
views.py์ฌ์ฉ์์(์ค์ ๋ก ์ผ๋ค)
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 = ..
>>> <QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Wecode>]>
# automatically saves to DB without using .save()
question1.choice_set.create(choice_text="coding")