Search
Duplicate

Model

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
객체 μˆ˜μ • μ‹œ μžλ™ μ €μž₯ (λ‚ μ§œ/μ‹œκ°„μš©)