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 | κ°μ²΄ μμ μ μλ μ μ₯ (λ μ§/μκ°μ©) |




