๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Web/๐ŸŒ› Django

Django ํŠœํ† ๋ฆฌ์–ผ (3)

์ฒซ ๋ฒˆ์งธ ์žฅ๊ณ  ์•ฑ ์ž‘์„ฑํ•˜๊ธฐ part 2

์ด ํŠœํ† ๋ฆฌ์–ผ์€ ํŠœํ† ๋ฆฌ์–ผ 1์žฅ์—์„œ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

 


๋ชจ๋ธ ๋งŒ๋“ค๊ธฐ

 

์ด์ œ ๋ชจ๋ธ์„ ์ •์˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋ณธ์งˆ์ ์œผ๋กœ, ๋ชจ๋ธ์ด๋ž€ ๋ถ€๊ฐ€์ ์ธ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์„œ์˜ ๊ตฌ์กฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

 

์„ค๋ฌธ ์กฐ์‚ฌ ์•ฑ์—์„œ 2๊ฐœ์˜ ๋ชจ๋ธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

  • Question
  • Choice

 

์ด๋Ÿฌํ•œ ๊ฐœ๋…์€ python์˜ ํด๋ž˜์Šค๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. polls/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)
  

 

๊ฐ๊ฐ์˜ ๋ชจ๋ธ๋ช…์ธ Question๊ณผ Choice ๋Š” 

 

python ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ์ปฌ๋Ÿผ๋ช…์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ๋ฉ๋‹ˆ๋‹ค.

 

์ด ์˜ˆ์ œ๋Š” ๊ฐ๊ฐ์˜ Choice๊ฐ€ ํ•˜๋‚˜์˜ Question์— ๊ด€๊ณ„๋ฉ๋‹ˆ๋‹ค.

 

๋‹ค-๋Œ€-์ผ(many-to-one), ๋‹ค-๋Œ€-๋‹ค(many-to-many), ์ผ-๋Œ€-์ผ(one-to-one) ๊ณผ ๊ฐ™์€ ๋ชจ๋“  ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ด€๊ณ„๋“ค๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

 

 


 

๋ชจ๋ธ์˜ ํ™œ์„ฑํ™”

 

๊ฐ€์žฅ ๋จผ์ € ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—๊ฒŒ polls ์•ฑ์ด ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

mysite/settings.py ์•ˆ์— INSTALLED_APPS ๋ฐฐ์—ด์•ˆ์— 'polls.apps.PollsConfig' ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

mysite/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',
]

 

์ด์ œ Django๋Š” polls์•ฑ์ด ํฌํ•จ๋œ ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

 

์ด์ œ ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ž์„œ ๋งŒ๋“  ๋ชจ๋ธ์„ ๋ณ€๊ฒฝ์‹œํ‚จ ์‚ฌ์‹ค๊ณผ ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ migration์œผ๋กœ ์ €์žฅ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋Š” ๊ฒƒ์„ Django์—๊ฒŒ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

 

$ python manage.py makemigrations polls

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ๋ณด์ผ ๊ฒ๋‹ˆ๋‹ค.

 

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

 

model ์ถ”๊ฐ€๊ฐ€ ์ ์šฉ๋œ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ makemigrations์€ Django๊ฐ€ ๋ชจ๋ธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋””์Šคํฌ์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

์ด์ œ migrate๋ช…๋ น์–ด๋ฅผ ํ•˜์—ฌ SQL์„ ์‹คํ–‰ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ๊ณผ ๊ด€๋ จ๋œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ด๋ด…์‹œ๋‹ค.

 

$ python manage.py migrate

 

migrate ๋ช…๋ น์€ ์•„์ง ์ ์šฉ๋˜์ง€ ์•Š๋Š” ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋ชจ๋‘ ์ˆ˜์ง‘ํ•ด ์ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ์ด ๊ณผ์ •์„ ํ†ตํ•ด ๋ชจ๋ธ์—์„œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋“ค๊ณผ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ์Šคํ‚ค๋งˆ์˜ ๋™๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

 

์ด์ œ ์•ž์œผ๋กœ ๋ชจ๋ธ์˜ ๋ณ€๊ฒฝ์„ ํ• ๋•Œ ๋‹ค์Œ ์„ธ๊ฐ€์ง€ ๋‹จ๊ณ„๋ฅผ ๊ธฐ์–ตํ•˜์„ธ์š”.

 

  • (models.py ์—์„œ) ๋ชจ๋ธ์„ ๋ณ€๊ฒฝ
  • python manage.py makemigrations ์„ ํ†ตํ•ด ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋งŒ๋“ฌ
  • python manage.py migrate ๋ช…๋ น์„ ํ†ตํ•ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉ

 


API ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

 

python์˜ ์‰˜์„ ์‚ฌ์šฉํ•˜๋ฉด cmd์— ๋ช…๋ น์–ด python์„ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

$ python

 

Django๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” Python ๋ชจ๋“ˆ ๊ฒฝ๋กœ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

๋‹ค์Œ ๋ช…๋ น์–ด๋Š” Django์—์„œ ๋™์ž‘ํ•˜๋Š” ๋ชจ๋“  ๋ช…๋ น์„ ๋Œ€ํ™”์‹ Python ์‰˜์—์„œ ๊ทธ๋Œ€๋กœ ์‹œํ—˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

$ python manage.py shell

 

์‰˜์— ์ง„์ž…ํ–ˆ์œผ๋‹ˆ API๋ฅผ ํƒํ—˜ํ•ด ๋ด…์‹œ๋‹ค.

 

>>> 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(2020, 6, 9, 13, 6, 7, 124941, tzinfo=<UTC>)

>>> q.question_text = "What's that?"
>>> q.save()

>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>

 

๋งˆ์ง€๋ง‰์— Question.objects.all() API๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ ์ด ๊ฐ์ฒด๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๋ฐ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋Š”๊ฒƒ ๊ฐ™์œผ๋‹ˆ

๋ชจ๋ธ์— __str__()๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ด…์‹œ๋‹ค.

 

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')

    def __str__(self):
        return self.question_text


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

    def __str__(self):
        return self.choice_text

 

๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์„ ์ €์žฅํ•˜๊ณ  ๋‹ค์‹œ ์‰˜์„ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค.

 

$ python manage.py shell

 

์ด๋ฒˆ์—๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ด…์‹œ๋‹ค.

 

>>> from polls.models import Choice, Question
>>> from django.utils import timezone

>>> Question.objects.all()
<QuerySet [<Question: What's that?>]>

>>> Question.objects.get(pk=1)
<Question: What's that?>

>>> q = Question.objects.get(pk=1)

>>> q.choice_set.all()
<QuerySet []>


>>> q.choice_set.create(choice_text='Network', votes=2)
<Choice: Network>
>>> q.choice_set.create(choice_text='Hardware', votes=1)
<Choice: Hardware>


>>> q.choice_set.all()
<QuerySet [<Choice: Network>, <Choice: Hardware>]>
>>> q.choice_set.count()
2

 


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

 

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

 

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

$ python manage.py createsuperuser
Username: admin
Email address: admin@naver.com
Password: **********
Password (again): *********
Superuser created successfully.

 

 


 

Django ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€

 

Django๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๊ฐ€ ํ™œ์„ฑํ™” ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์ผœ๊ณ  ํƒํ—˜ํ•ด๋ด…์‹œ๋‹ค!

 

$ python manage.py runserver

 

์ด์ œ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด๊ณ  http://127.0.0.1:8000/admin/ ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ ‘๊ทผํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ๊ทธ์ธ ํ™”๋ฉด์ด ๋ณด์ผ ๊ฒ๋‹ˆ๋‹ค.

 

 

์•ž์„œ ์ƒ์„ฑํ•œ ์Šˆํผ์œ ์ € ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ Django ๊ด€๋ฆฌ ์ธ๋ฑ์Šค ํŽ˜์ด์ง€๊ฐ€ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

 

์ด๊ฒƒ๋“ค์€ django.contrib.auth ๋ชจ๋“ˆ์—์„œ ์ œ๊ณต๋˜๋Š”๋ฐ, Django ์—์„œ ์ œ๊ณต๋˜๋Š” ์ธ์ฆ ํ”„๋ ˆ์ž„์›Œํฌ ์ž…๋‹ˆ๋‹ค.

 

 

์—ฌ๊ธฐ์„œ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์— poll app์„ ๋ณด์ด๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

polls/admin.py ํŒŒ์ผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

 

polls / admin.py 
----------------------------------------------------------------
from django.contrib import admin

from .models import Question

admin.site.register(Question)

 

ํŽธ์ง‘์„ ํ•œ ํ›„ ๋ฆฌ๋กœ๋“œ๋ฅผ ํ•ด๋ณด๋ฉด polls์•ฑ์ด ๋‚˜ํƒ€๋‚œ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

'Web > ๐ŸŒ› Django' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Django ํ…œํ”Œ๋ฆฟ ์–ธ์–ด  (0) 2020.06.10
Django ํŠœํ† ๋ฆฌ์–ผ (4)  (0) 2020.06.10
Django ํŠœํ† ๋ฆฌ์–ผ (2)  (0) 2020.06.09
Django ํŠœํ† ๋ฆฌ์–ผ (1)  (0) 2020.06.09