MTV ํจํด์์์ Model
Model์ MTV(Model-Template-View) ํจํด์์ ๋ฐ์ดํฐ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ ํต์ฌ ์ปดํฌ๋ํธ์
๋๋ค.
Model์ ์ฃผ์ ํน์ง
โข
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์กฐ๋ฅผ Python ํด๋์ค๋ก ํํ
โข
๋ฐ์ดํฐ์ ์ ํจ์ฑ ๊ฒ์ฌ์ ๊ด๊ณ ์ค์ ์ ๋ด๋น
โข
ORM(Object-Relational Mapping)์ ํตํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐ์
โข
๋น์ฆ๋์ค ๋ก์ง ๊ตฌํ์ ์ค์ฌ์ ์ญํ ์ํ
Django Model ์์ ์ฝ๋
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
class Meta:
ordering = ['-created_at']
Python
๋ณต์ฌ
์ ์ฝ๋๋ ๊ฒ์๊ธ(Article) ๋ชจ๋ธ์ ์ ์ํ ์์์
๋๋ค.
์ฝ๋ ์ค๋ช
โข
models.Model: Django์ ๊ธฐ๋ณธ Model ํด๋์ค๋ฅผ ์์๋ฐ์ ์๋ก์ด ๋ชจ๋ธ์ ์ ์
โข
Field ํ์
: CharField, TextField, DateTimeField ๋ฑ ๋ค์ํ ํ๋ ํ์
์ฌ์ฉ ๊ฐ๋ฅ
โข
Meta ํด๋์ค: ๋ชจ๋ธ์ ๋ฉํ๋ฐ์ดํฐ(์ ๋ ฌ, ํ
์ด๋ธ๋ช
๋ฑ) ์ค์
โข
__str__ ๋ฉ์๋: ๋ชจ๋ธ ์ธ์คํด์ค์ ๋ฌธ์์ด ํํ์ ์ ์
Model ๊ด๊ณ ์ค์ ์์
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Post(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE)
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
Python
๋ณต์ฌ
์ด ์์๋ Category์ Post ๋ชจ๋ธ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
์ฃผ์ ๊ด๊ณ ํ๋
โข
ForeignKey: 1:N ๊ด๊ณ ์ค์
โข
ManyToManyField: N:M ๊ด๊ณ ์ค์
โข
OneToOneField: 1:1 ๊ด๊ณ ์ค์
Model ์ฌ์ฉ์ ์ฅ์
โข
๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐ์์ ์ํ ์ง๊ด์ ์ธ API ์ ๊ณต
โข
๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ
โข
์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋ ์์ฑ ์ฉ์ด
โข
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์
์๋ํ
Django์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค: SQLite
Django๋ ๊ธฐ๋ณธ์ ์ผ๋ก SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋๋ก ์ค์ ๋์ด ์์ต๋๋ค.
SQLite๋ ํ์ผ ๊ธฐ๋ฐ์ ๊ฐ๋ฒผ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก, ๊ฐ๋ฐ ๋ฐ ํ
์คํธ ํ๊ฒฝ์ ์ ํฉํฉ๋๋ค.
SQLite์ ํน์ง
โข
์ค์น ๋ถํ์: Python์ ๋ด์ฅ๋์ด ์์ด ๋ณ๋ ์ค์น๊ฐ ํ์ ์์
โข
ํ์ผ ๊ธฐ๋ฐ: ๋จ์ผ ํ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ด๋ฆฌ๋จ
โข
๊ฐ๋ฒผ์: ์์ ๊ท๋ชจ์ ํ๋ก์ ํธ์ ์ ํฉํ ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค
โข
์ค์ ๊ฐํธ: ์ถ๊ฐ ์ค์ ์์ด ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
settings.py ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
Python
๋ณต์ฌ
์ด๋ Django ํ๋ก์ ํธ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ์ผ๋ก, db.sqlite3 ํ์ผ์ด ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ์์ฑ๋ฉ๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ์์ฑ ๋ช ๋ น์ด
# ๋ชจ๋ธ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์งํ์ฌ ๋ง์ด๊ทธ๋ ์ด์
ํ์ผ ์์ฑ
python manage.py makemigrations
# ํน์ ์ฑ์ ๋ง์ด๊ทธ๋ ์ด์
์์ฑ
python manage.py makemigrations myapp
Python
๋ณต์ฌ
๋ง์ด๊ทธ๋ ์ด์ ์ ์ฉ ๋ช ๋ น์ด
# ๋ง์ด๊ทธ๋ ์ด์
์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฉ
python manage.py migrate
# ํน์ ์ฑ์ ๋ง์ด๊ทธ๋ ์ด์
๋ง ์ ์ฉ
python manage.py migrate myapp
# ํน์ ๋ง์ด๊ทธ๋ ์ด์
๊น์ง๋ง ์ ์ฉ
python manage.py migrate myapp 0002
Python
๋ณต์ฌ
๋ง์ด๊ทธ๋ ์ด์
์ ๋ชจ๋ธ์ ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง์ ๋ฐ์ํ๋ Django์ ๋ฐฉ์์
๋๋ค.
์ฃผ์ ๋ง์ด๊ทธ๋ ์ด์ ๋ช ๋ น์ด ์ค๋ช
โข
makemigrations: ๋ชจ๋ธ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์งํ์ฌ ๋ง์ด๊ทธ๋ ์ด์
ํ์ผ์ ์์ฑ
โข
migrate: ์์ฑ๋ ๋ง์ด๊ทธ๋ ์ด์
์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ค์ ๋ก ์ ์ฉ
โข
showmigrations: ํ๋ก์ ํธ์ ๋ง์ด๊ทธ๋ ์ด์
์ํ๋ฅผ ํ์ธ
โข
sqlmigrate: ๋ง์ด๊ทธ๋ ์ด์
์ด ์คํํ SQL ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ํ์ธ
Django ๋ชจ๋ธ ํ๋ ํ์
ํ๋ ํ์
| ์ค๋ช
|
CharField(max_length) | ์งง์ ๋ฌธ์์ด (์: ์ด๋ฆ, ์ ๋ชฉ ๋ฑ) |
TextField() | ๊ธด ๋ฌธ์์ด (์: ๋ณธ๋ฌธ, ์ค๋ช
๋ฑ) |
IntegerField() | ์ ์ |
FloatField() | ์ค์ |
DecimalField(max_digits, decimal_places) | ๊ณ ์ ์์์ ์ซ์ |
BooleanField() | True/False |
DateField() | ๋ ์ง (YYYY-MM-DD) |
TimeField() | ์๊ฐ (HH:MM[:ss]) |
DateTimeField() | ๋ ์ง + ์๊ฐ |
EmailField() | ์ด๋ฉ์ผ ํ์ ๋ฌธ์์ด |
URLField() | URL ํ์ ๋ฌธ์์ด |
ImageField(upload_to=...) | ์ด๋ฏธ์ง ํ์ผ (Pillow ํ์) |
FileField(upload_to=...) | ํ์ผ ์
๋ก๋ |
ForeignKey(model, on_delete) | ๋ค๋ฅธ ๋ชจ๋ธ๊ณผ 1:N ๊ด๊ณ |
OneToOneField(model, on_delete) | 1:1 ๊ด๊ณ |
ManyToManyField(model) | ๋ค๋๋ค ๊ด๊ณ |
SlugField() | URL-friendly ๋ฌธ์์ด |
UUIDField() | UUID ๊ฐ ์ ์ฅ |
AutoField() | ์๋ ์ฆ๊ฐ ID (๊ธฐ๋ณธ ํค) |
BigAutoField() | ๋งค์ฐ ํฐ ์๋ ์ฆ๊ฐ ID (๊ธฐ๋ณธ ํค ๋์ฒด) |
ํ๋ ๊ณตํต ์ต์
์ ๋ฆฌ
์ต์
| ์ค๋ช
|
null=True | DB์ NULL ํ์ฉ (NOT NULL ์ ๊ฑฐ) |
blank=True | Form ์ ํจ์ฑ ๊ฒ์ฌ์์ ๋น์๋ ๋จ |
default=value | ๊ธฐ๋ณธ๊ฐ ์ง์ |
unique=True | ์ค๋ณต ๋ถ๊ฐ (์ ์ผ ๊ฐ) |
choices=[(v1, label1), (v2, label2)] | ์ ํ์ง ์ ํ |
verbose_name='ํ๋ ์ด๋ฆ' | Admin/ํผ์์์ ํ์ ์ด๋ฆ |
help_text='๋์๋ง' | Admin ๋ฑ์์ ์ค๋ช
|
editable=False | Admin/ํผ์์ ์์ ๋ถ๊ฐ |
auto_now_add=True | ๊ฐ์ฒด ์์ฑ ์ ์๋ ์ ์ฅ (๋ ์ง/์๊ฐ์ฉ) |
auto_now=True | ๊ฐ์ฒด ์์ ์ ์๋ ์ ์ฅ (๋ ์ง/์๊ฐ์ฉ) |