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
๊ฐ์ฒด ์ˆ˜์ • ์‹œ ์ž๋™ ์ €์žฅ (๋‚ ์งœ/์‹œ๊ฐ„์šฉ)