์ฒซ ๋ฒ์งธ ์ฅ๊ณ ์ฑ ์์ฑํ๊ธฐ 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 |