๐Ÿ”ฅ ์žฅ๊ณ  ํŠœํ† ๋ฆฌ์–ผ ์ง„ํ–‰ํ•ด๋ณด๊ธฐ2

may_soouuยท2020๋…„ 8์›” 26์ผ
2

Django

๋ชฉ๋ก ๋ณด๊ธฐ
3/9

์žฅ๊ณ ์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ SQLite๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด ๋ณ„๋„๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

mysite/setting.py
 ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

1. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๊ธฐ

migrate ๋ช…๋ น์–ด๋Š” INSTALLED_APPS๋ฅผ ๋ณด๊ณ , ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค.

python manage.py migrate

2. ๋ชจ๋ธ ์ƒ์„ฑํ•˜๊ธฐ

๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ์ด์•„์›ƒ์„ ์ •์˜ํ•œ๋‹ค.
Django ์—์„œ๋Š” DB ๋ฅผ model.py์— ์„ค์ •ํ•ด์คŒ์œผ๋กœ์จ ๋งŒ๋“ค์–ด์ค€๋‹ค.
ํŠœํ† ๋ฆฌ์–ผ์˜ ๊ฒฝ์šฐ ๋‘๊ฐ€์ง€ ๋ชจ๋ธ์„ ์ƒ์„ฑํ•œ๋‹ค.

Question : ์งˆ๋ฌธ๊ณผ ๊ฒŒ์‹œ ๋‚ ์งœ
Choice : ์„ ํƒ ํ…์ŠคํŠธ์™€ ํˆฌํ‘œ ์ง‘๊ณ„

์ด ๋‚ด์šฉ์„ models.py ์—์„œ ์ˆ˜์ •ํ•ด๋ณด์ž

polls/models.py
 # ์•„๋ž˜ ๋‚ด์šฉ ์ž…๋ ฅ
from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

ํด๋ž˜์Šค๋กœ ํ•˜๋‚˜์˜ ๋ชจ๋ธ์ด ๋งŒ๋“ค์–ด์ง€๋ฉฐ, django.db.models.Model ์„ ์ƒ์†๋ฐ›์•„์•ผํ•œ๋‹ค.

Question์˜ ๊ฒฝ์šฐ, CharField ์™€ DateTimeField๋ฅผ ์ธ์Šคํ„ด์Šค๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์–ด๋–ค ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์•Œ๋ ค์ค€๋‹ค.


Charfield : ํ•œ ์ค„ ์ •๋„์˜ ๋ฌธ์ž
DateTimeField : ๋‚ ์งœ์™€ ์‹œ๊ฐ„
IntegerField : ์ˆซ์ž(์ •์ˆ˜)ํ˜•์‹
max_length : ์ตœ๋Œ€ ๊ธ€์ž์ˆ˜
default=0 : ์ดˆ๊ธฐ๊ฐ’ ์ง€์ •


ForeignKey๋Š” Choice์™€ Question์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ด€๊ณ„๋‹ค
Foreignkey

2-1. ๋ชจ๋ธ ํ™œ์„ฑํ™”

๋ชจ๋ธ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ผญ ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋ธ ํ™œ์„ฑํ™”์ด๋‹ค.
polls ์•ฑ์ด ์„ค์น˜ ๋์Œ์„ INSTALLED_APPS ์— ์•Œ๋ ค์ฃผ์ž

mysite/settings.py
# settings.py ํŒŒ์ผ ์—ด๊ธฐ

์•„๋ž˜ ๋‚ด์šฉ ์ถ”๊ฐ€

INSTALLED_APPS = [
    'polls.apps.PollsConfig'      #์ถ”๊ฐ€
    'django.contrib.admin',       # ์•„๋ž˜๋‚ด์šฉ๋“ค์€ ๊ธฐ๋ณธ์œผ๋กœ ์žˆ์„ ๊ฒƒ์ž„
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

* ํ˜•์‹ : ์•ฑ์ด๋ฆ„.apps.app์ด๋ฆ„(๋งจ์•ž๋Œ€๋ฌธ์ž)Config

์œ„ ๋‚ด์šฉ์„ polls ๋ฐ‘์— migrations ํด๋”๋ฅผ ๋งŒ๋“ค์–ด์„œ ์žฅ๊ณ ์™€ ๋””๋น„๊ฐ€ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ

python manage.py makemigrations polls

๊ทธ๋Ÿผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค.

Migrations for 'polls':
  polls/migrations/0001_initial.py
    - Create model Question
    - Create model Choice

makemigrations๋ผ๋Š” ๋ช…๋ น์–ด๋Š” Django์—๊ฒŒ '๋ชจ๋ธ์„ ์ผ๋ถ€ ๋ณ€๊ฒฝํ–ˆ๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ• ๋ž˜' ๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

python manage.py sqlmigrate polls 0001
  # 0001 ํŒŒ์ผ ์ƒ์„ฑ๋œ ๊ฒƒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

๋งŒ์•ฝ, migrate (๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉ)ํ•œ ํŒŒ์ผ๋“ค์„ ๋ณด๊ณ ์ž ํ•œ๋‹ค๋ฉด

python manage.py showmigrations
  # x ์ฒดํฌ ๋œ ๊ฒƒ์ด ์™„๋ฃŒ๋œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ๋“ค
python manage.py migrate
  # ์ตœ์ข…์ ์œผ๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ €์žฅํ•ด์ค€๋‹ค.
  # ์—ฌ๊ธฐ๊นŒ์ง€ polls์˜ app์˜ model์ด ํ”„๋กœ์ ํŠธ์— ์—…๋ฐ์ดํŠธ ๋จ !!! 

4. API

Django ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฌด๋ฃŒ API๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž

$ python manage.py shell
# shell ์— ๋“ค์–ด๊ฐ€์„œ DB ์ž‘์„ฑํ•˜๊ธฐ
>>> from polls.models import Choice, Question
>>> Question.objects.all()
<QuerySet []>
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())

>>> q.save()
>>> q.id
1
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
>>> q.question_text = "What's up?"
>>> q.save()
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>
์œ„์˜ ๋Œ€๋กœ ๋‘๋ฉด ๋‚ด๊ฐ€ question ์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ, 
์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํด๋ฆญํ•˜๊ณ  ๋“ค์–ด๊ฐ€์•ผ question text ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 


ํด๋ฆญํ•ด์„œ ๋“ค์–ด๊ฐ€์ง€ ์•Š์•„๋„ Question object ๋ถ€๋ถ„์—
Question text ๊ฐ€ ๋ฐ”๋กœ ๋ณด์ด๊ฒŒ ์„ค์ •ํ•˜์ž

polls / models.py 
# ์œ„ ๊ฒฝ๋กœ์—์„œ ์•„๋ž˜ ๋‚ด์šฉ ์ถ”๊ฐ€
from django.db import models

class Question(models.Model):
  # ...
  def __str__(self):
      return self.question_text

class Choice(models.Model):
  # ...
  def __str__(self):
      return self.choice_text

### ... ๋ถ€๋ถ„์€ ์›๋ž˜ ์žˆ๋˜ ๋ถ€๋ถ„!! ์ง€์šฐ์ง€ ๋ง๊ณ  ์•„๋ž˜์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.


โœ‹๐Ÿป ์—ฌ๊ธฐ์„œ ์ž ๊น, ์ฟผ๋ฆฌ์…‹ ๊ฐœ๋…์„ ์•Œ๊ณ ๊ฐ€์ž

  • ์ฟผ๋ฆฌ์…‹์ด๋ž€ ?
    - ์ „๋‹ฌ๋ฐ›์€ ๋ชจ๋ธ์˜ ๊ฐ์ฒด ๋ชฉ๋ก. ์ฆ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ํ•„ํ„ฐ๋ฅผ ๊ฑธ๊ฑฐ๋‚˜ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‚ด์šฉ์ด ๋งŽ์•„์„œ ๋”ฐ๋กœ ๋ฒจ๋กœ๊ทธ ์ •๋ฆฌ๋ฅผ ํ–ˆ๋‹ค.
    queryset

5. ๊ด€๋ฆฌ์ž ์ƒ์„ฑํ•˜๊ธฐ

๊ด€๋ฆฌ ์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ด€๋ฆฌ์ž๋ฅผ ์ƒ์„ฑํ•ด๋ณด์ž.

python manage.py createsuperuser

 # user name, email, password ๋“ฑ๋กํ•˜๋ผ๊ณ  ๋œฐํ…๋ฐ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค!
 # password ๋Š” ์ž…๋ ฅํ•ด๋„ ํ„ฐ๋ฏธ๋„์ƒ์— ์•ˆํƒ€๋‚ ํ…๋ฐ ์ž…๋ ฅ๋˜๊ณ  ์žˆ๋Š” ๊ฑฐ๋‹ˆ๊นŒ 
   ๊ทธ๋ƒฅ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค ~

6. ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹œ์ž‘

์„œ๋ฒ„๋ฅผ ํ™•์ธํ•ด๋ณด์ž

python manage.py runserver

์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด๊ณ , ๋กœ์ปฌ ๋„๋ฉ”์ธ(http://127.0.0.1:8000/)์—์„œ /admin ์œผ๋กœ ์ด๋™
๊ด€๋ฆฌ์ž์˜ ๋กœ๊ทธ์ธ ํ™”๋ฉด์ด ํ‘œ์‹œ๋˜์–ด์•ผํ•œ๋‹ค.
โœ‹๐Ÿป ๊ทธ๋Ÿฌ๋‚˜!! ์•„์ง polls app์„ admin์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜์ง€ ์•Š์•˜๋‹ค.
Question ๊ฐ์ฒด์— ๊ด€๋ฆฌ์ž๊ฐ€ ์žˆ์Œ์„ ์•Œ๋ ค์ค˜์•ผ ํ•œ๋‹ค.

polls/admin.py
 # ์œ„์˜ ๊ฒฝ๋กœ์—์„œ ์•„๋ž˜ ๋‚ด์šฉ ์ž…๋ ฅ
from django.contrib import admin

from .models import Question

admin.site.register(Question)
profile
back-end ๊ฐœ๋ฐœ์ž

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