Django Model(์ฌํ)
๐พ Django ์ฅ๊ณ ์์ ๋ชจ๋ธ ์ด์ฉํ๊ธฐ
๋ชจ๋ธ์์ ์ ํ๋ฉฐ ์ฐ๋ฆฌ๊ฐ ์ด์ฉํ๋ ์ฅ๊ณ ํจํค์ง
django-model-utils: TimeStampedModel ๊ฐ์ ์ผ๋ฐ์ ์ธ ํจํด๋ค์ ์ฒ๋ฆฌํ๋๋ฐ ์ด์ฉ
django-extensions : ๋ชจ๋ ์ฑ์ ๋ชจ๋ธํด๋์ค๋ฅผ ์๋์ผ๋ก ๋ก๋ํด์ฃผ๋ shell_plus๋ผ๋ ๊ฐ๋ ฅํ ๊ด๋ฆฌ๋ช ๋ น ์ ๊ณต ๋จ์ ์ ์์ง๋ง ์ญํ ์ด ๋ถ๋ช ํ ์ฑ ๊ฐ๋ ์ ๋ง์ง์๊ฒ ๋๋ฌด ๋ค์ํ ๊ธฐ๋ฅ
๋ชจ๋ธ์ ์ฅ๊ณ ํ๋ก์ ํธ์ ํ ๋๊ฐ ๋๋ ์ค์ํ ๋ถ๋ถ์ด๋ค ๋ฐ๋ผ์ ๋ชจ๋ธ์ ์์ฑ๊ณผ ์์ ์์๋ ๋ค์์ ๊ฐ๋ ๋ค์ ์๊ฐํด์ฃผ๋๋ก ํ์
- ์์ํ๊ธฐ
- ๋ชจ๋ธ์ด ๋๋ฌด ๋ง์ผ๋ฉด ์ฑ์ ๋๋๋ค(1๊ฐ์ ์ฑ๋น ๋ชจ๋ธ์ 5๊ฐ๋ฅผ ๋์ง์์์ผํ๋ค)
- ๋ชจ๋ธ ์์์ ์ฃผ์ํ์
๋ง์ฝ ์์์ ํ์ง์๋๋ค๋ฉด? ๋ชจ๋ธ๋ค ์ฌ์ด์ ๊ณตํตํ๋๊ฐ ์์ผ๋ฉด ๋ ๋ชจ๋ธ์ ์ ๋ถ ํ๋๋ฅผ ์์ฑ
- ์ฅ์ : DB Table์ ์ด๋ค์์ผ๋ก Mapping๋๋ ์ง ์๊ด์์ด ํ๋์ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๊ตฌ์ฑ
- ๋จ์ : ์ค๋ณต๋๋ Table์ด ๋ง์๊ฒฝ์ฐ ๊ด๋ฆฌ์ ์ด๋ ค์
- ๋ชจ๋ธ์ ์์
- ์ถ์ํ๊ธฐ์ดํด๋์ค(abstract base class)(ํ์ด์ฌ๊ณผ ๋ค๋ฅด๋ค) (๋ชจ๋ธ์ฌ์ด์ ์ค๋ณต๋ํ๋๊ฐ ๋ง์๋)
์ค์ง ์์๋ฐ์ ์์ฑ๋ ๋ชจ๋ธ๋ค์ ํ ์ด๋ธ๋ง ์์ฑ
- ์ฅ์ : ์ถ์ํ๋ ํด๋์ค์ ๊ณตํต๋ถ๋ถ์ ์ถ๋ ค๋์ ํ๋ฒ๋ง ํ์ดํ์ ํ๋ฉด ๋๋ค. ์ถ๊ฐ ํ ์ด๋ธ์ด ์์ฑ๋์ง์๊ณ ์ฌ๋ฌํ ์ด๋ธ์ ์กฐ์ธํจ์ผ๋ก์จ ๋ฐ์ํ๋ ์ฑ๋ฅ ์ ํ์๋ค
- ๋จ์ : ๋ถ๋ชจํด๋์ค๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์ด์ฉํ ์ ์๋ค
๊ณตํต ํ๋๋ถ๋ถ์ ์ถ์ํ ๊ธฐ์ด๋ชจ๋ธ๋ก ์ด์ ํ๋ ๋ฆฌํฉํฐ๋ง ์์ ์๊ตฌ
- ๋ฉํฐ ํ ์ด๋ธ ์์(multi-table inheritance)ํผ๋๊ณผ ๋ถํ๋ฅผ ์ผ์ผํค๋ฏ๋ก ์ด์ฉ ์ง์
๋ถ๋ชจ์ ์์ ๋ชจ๋ธ์ ๋ํด์ ๋ชจ๋ ํ ์ด๋ธ ์์ฑ, One to One Field๋ ๋ถ๋ชจ์ ์์๊ฐ์ ์ ์ฉ
- ์ฅ์ : ๊ฐ ๋ชจ๋ธ์ ๋งค์นญ๋๋ ํ ์ด๋ธ์ด ์์ฑ, ๋ฐ๋ผ์ ๋ถ๋ชจ๋๋ ์์ ๋ชจ๋ธ ์ด๋๋ก๋ ์ฟผ๋ฆฌ ๋ถ๋ชจ๋ก๋ถํฐ ์์๊ฐ์ฒด ํธ์ถ ๊ฐ๋ฅ
- ๋จ์ : ์์ํ ์ด๋ธ์ ์ฟผ๋ฆฌ์ ๋ํด ๋ถ๋ชจ ํ ์ด๋ธ๋ก์ ์กฐ์ธ์ด ๋ค์ด๊ฐ ๋ถํ๊ฐ ๊ฑธ๋ฆฐ๋ค. ์ด์ฉํ์ง๋ง์ ์ฐจ๋ผ๋ฆฌ one to one fields์ foreign Keys๋ฅผ ์ด์ฉํด ์ปจํธ๋กคํ์
- ํ๋ฝ์ ๋ชจ๋ธ(proxy model)
์๋ ๋ชจ๋ธ์ ๋ํด์๋ง ํ ์ด๋ธ์ด ์์ฑ
- ์ฅ์ : ๊ฐ๊ธฐ ๋ค๋ฅธ ํ์ด์ฌ ์์ฉ์ ํ๋ ๋ชจ๋ธ๋ค์ ๋ณ์นญ์ ๊ฐ์ง ์ ์๋ค.
- ๋จ์ : ๋ชจ๋ธ์ ํ๋๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค
์ค์ ๋ชจ๋ธ ์์ํด๋ณด๊ธฐ
์ผ๋ฐ์ ์ผ๋ก created ์ modified ์ ๊ฐ์ Time Stamp field ๋ ๋ชจ๋ ๋ชจ๋ธ๋ค์ด ์์ฑํด๋๋๋ฐ Time Stamped Model์ ๋ง๋ค์ด ์ฐ๋ฆฌ ๋์ ํ๋ ์ถ๊ฐ ์ฒ๋ฆฌ๋ฅผ ํ ์์๊ฒ ํด์ฃผ์
์ด๋ ์ผ๋ฐ ํด๋์ค์ ๋ค๋ฅธ์ ์ ์ฐ๋ฆฌ๊ฐ ์ ์ธํ๋ Model Class์์
class Meta:
abstract = True #์ด์ ๊ฐ์ด ์ค์ ํด์ค ์ถ์ํ๊ธฐ์ดํด๋์ค๋ก ๋ง๋ค์ด ์ฃผ๋๊ฒ์ด๋ค
์ด๋ก์จ ๋ง์ด๊ทธ๋ ์ด์ ์ ํ ๋ ํ ์ด๋ธ์ด ์์ฑ๋์ง ์๋๋ค (๋ง์ฝ ์ด๊ฒ ์๋ ๋ฉํฐํ ์ด๋ธ ์์์ด์์ผ๋ฉด makemigration์ timestamp ํ ์ด๋ธ๋ ์์ฑ๋๊ณ ์์๋ฐ์ ํ ์ด๋ธ๋ค์ด timestamp์ ์ฐ๊ฒฐ๋๋ ์ธ๋ถํค๋ก time ์ฒ๋ฆฌํ๊ณ ์์์๊ฒ)
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์
๋ง์ด๊ทธ๋ ์ด์ ์ ์์ฑ Tip
์๋ก์ด ์ฑ์ด๋ ๋ชจ๋ธ์ด ์์ฑ๋๋ฉด python manage.py makemigration
์์ฑ๋ ์ฝ๋๋ฅผ ์คํํ๊ธฐ์ ์์ฑ๋ ์ฝ๋๋ฅผ ์ดํด๋ด์ผํ๋ค(ํนํ ๋ณ๊ฒฝ์ฌํญ์ด ๋ณต์กํ ์๋ก
sqlmigrate
๋ช
๋ น์ ํตํด ํด๋น migration
์ผ๋ก ์ด๋ค SQL๋ฌธ์ด ์คํ๋๋์ง๋ ํ์ธํ์)
๋ง์ฝ ์์ฒด์ ์ธ django migrations ์คํ์ผ๋ก ์ด๋ฃจ์ด์ง์ง ์์ ์ธ๋ถ์ฑ์ ๋ํด์๋ MIGRATION_MODULES์ ํ ์ด์ฉ
์์ฑ๋๋ migration์ ๊ฐฏ์์ ์ฐ์ฐํ์ง ๋ง์(๋๋ฌด ๋ง์ ๋ถํธํ๋ฉด squashmigrations
๋ฅผ ์ด์ฉ)
๋ง์ด๊ทธ๋ ์ด์ ์ ๋ฐฐํฌ ๋ฐ ๊ด๋ฆฌ
๋ฐฐํฌ์ ์ rollback ํ ์ ์๋์ง ํ์ธํด๋ณด์(rollback์ด ๋ถ๊ฐ๋ฅํ๋ฉด ํ๋ก์ ํธ์์ ๋ฒ๊ทธ ํธ๋ํน ๋ฑ์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค)
Table์ ๋ฐ์ดํฐ๊ฐ ๋ง๋ค๋ฉด ์ด์ ์๋ฒ์์ migration ํ๊ธฐ์ ์ staging์๋ฒ์์ ์ถฉ๋ถํ ํ ์คํธ ํด๋ณด์ (์ด์์๋ฒ์ migration์ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค)
MySQL์ ์ด์ฉํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์คํค๋ง ๋ณํ์ DB ๋ฐฑ์ ํด๋๋ค.(MySQL ์ ์คํค๋ง ๋ณ๊ฒฝ์ ๋ํ ํธ๋์ญ์ ์ ์ง์ X rollback๋ถ๊ฐ) ๊ฐ๋ฅํ๋ค๋ฉด DB๋ณํ์ด์ ์ ํ๋ก์ ํธ๋ฅผ read ๋ชจ๋๋ก ๋ณ๊ฒฝ ํฐ Table์ ๊ฒฝ์ฐ ์คํค๋ง ๋ณ๊ฒฝ์ ์ค๋ ์๊ฐ์ด ์์๋ ์ ์๋ค.
์ฅ๊ณ ๋ชจ๋ธ ๋์์ธ
- DB์ ๊ทํ ์ด๋ฏธ ๋ชจ๋ธ์ ํฌํจ๋ data๊ฐ ์ค๋ณต๋์ด ๋ค๋ฅธ ๋ชจ๋ธ์ ํฌํจ๋์ง ์๋๋ก ํ์
- ์บ์์ ๋น์ ๊ทํ ์ ์ ํ ์์น์์ ์บ์๋ฅผ ์ธํ ํ๋ ๊ฒ์ ๋ชจ๋ธ์ ๋น์ ๊ทํ์์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
- ๋ฐ๋์ ํ์ํ ๊ฒฝ์ฐ์๋ง ๋น์ ๊ทํ
- ์ธ์ Null์ ์ฐ๊ณ ์ธ์ ๊ณต๋ฐฑ์ ์ธ๊น
์ผ๋ฐ์ ๊ฐ์ด๋
Null = True Integer,Float,Decimal,Duration(๊ฐ์ด DB์ NULL๋ก ๋ค์ด๊ฐ๋ ๋๋ค๋ฉด) DateTime,Date,Time,ForeignKey,ManyToMany,OneToOne,GenericIPAddress (DB์์ NULL๊ฐ ์ค์ ์ด ๊ฐ๋ฅํ๋ฉด)
Null = False Char,Text,Slug,Email,CommaSeparatedInteger,UUID,File,Image,BooleanField
blank = True Char,Text,Slug,Email,CommaSeparatedInteger,UUID,File,Image,Integer,Float,Decimal,Duration,DateTime,Date,Time,ForeignKey,ManyToMany,OneToOne,GenericIPAddress
blank = False BooleanField
- ์ธ์ BinaryField๋ฅผ ์ด์ฉํ ๊ฒ์ธ๊ฐ
filter, exclude, ๋ฑ์ SQL์ก์ ์ด ์ ์ฉ๋์ง ์๋๋ค ๋ฉ์์งํฉ ํ์์ ์ฝํ ์ธ , ์๋ณธ ์ผ์ ๋ฐ์ดํฐ, ์์ถ๋ ๋ฐ์ดํฐ ํ์ง๋ง DBํ๋์ ์ด์ฒ๋ผ ํ์ผ์ ์ง์ ์ ์ฅํ๊ฒ ๋๋ฉด DB์ ์๋๊ฐ ๋๋ ค์ง์ ์๋ค. ๋ฐ๋ผ์ fileField์ reference๋ง ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ์ ํ ์ ์๋ค.
- ๋ฒ์ฉ๊ด๊ณ ํผํ๊ธฐ
๋ฒ์ฉ๊ด๊ณ๋ ํ ํ ์ด๋ธ๋ก ๋ถํฐ ๋ค๋ฅธ ํ ์ด๋ธ์ ์๋ก ์ ์ฝ์กฐ๊ฑด ์๋ foreignkey๋ก ๋ฐ์ธ๋ฉ ํ๋๊ฒ
๋ฌธ์ ์ : ๋ชจ๋ธ๊ฐ์ ์ธ๋ฑ์ฑ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์ฟผ๋ฆฌ์๋์ ์ํด ๋ค๋ฅธ ํ ์ด๋ธ์ ์กด์ฌํ์ง ์๋ ๋ ์ฝ๋๋ฅผ ์ฐธ์กฐํ ์์๋ ๋ฐ์ดํฐ ์ถฉ๋ ์ํ์ฑ
ํ์ง๋ง ์ฑ์ ์๋ก ์ ์ํจ์ ์์ด ํธํ๊ธฐ์ ์ฆ๊ฒจ์ฐพ๊ธฐ, ํ๊น ๋ฑ์ ์ฑ์ด ๋ฒ์ฉ๊ด๊ณ๋ก ๋ง๋ค์ด ์ก๋๋ฐ
๊ทธ๋๋ ๋ฒ์ฉ ๊ด๊ณ์ GenericForeignKey ์ด์ฉ์ ํผํ๊ณ ๋ฒ์ฉ๊ด๊ณ๊ฐ ํ์ํ๋ฉด ๋ชจ๋ธ ๋์์ธ์ ๋ฐ๊ฟ๋ณด์ ๋ถ๊ฐํผํ๊ฒ ์ด์ฉํด์ผํ๋ค๋ฉด ์๋ ํํฐ ์ฑ์ ์ฌ์ฉํด๋ณด์ ์ธ๋ถ์ฑ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฅผ ๊น๋ํ๊ฒ ์ ์งํ๋๋ฐ ๋์์ ์ค๋ค
๋ชจ๋ธ์ _mata API
-
_meta๊ธฐ๋ฅ์ด ํ์ํ ์ด์
- ๋ชจ๋ธ ํ๋์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ธ์ฌ๋
- ๋ชจ๋ธ์ ํน์ ํ๋์ ํด๋์ค๋ฅผ ๊ฐ์ ธ์ฌ๋(ํน์ ์์๊ด๊ณ๋ ์์์ ํตํด ์์ฑ๋ ์ ๋ณด)
- ์ ๋ณด๋ฅผ ์ด๋ป๊ฒ ๊ฐ์ ธ์ค๊ฒ ๋์๋์ง ํ์คํ๊ฒ ์์๋ก ๋จ๊ธฐ๋ ค๊ณ
-
_mata๊ธฐ๋ฅ์ด ํ์ํ ๋
- ์ฅ๊ณ ๋ชจ๋ธ์ ์์ฒด ๊ฒ์ฌ๋๊ตฌ
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด ํน๋ณํ๊ฒ customizing๋ ์ฅ๊ณ ๋ฅผ ๋ง๋ค๋
- ์ฅ๊ณ ์ ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ ํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์์๋ ๊ด๋ฆฌ๋๊ตฌ ์ ์ํ ๋
- ์๊ฐํ ๋๋ ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ํ ๋
๋ชจ๋ธ ๋งค๋์
๋ชจ๋ธ์ ์ง์๋ฅผ ๋์ง๋ฉด ์ฅ๊ณ ์ ORM์ ํตํ๊ฒ ๋๋๋ฐ ์ด๋ model manager๋ผ๋ DB์ ์ฐ๋ํ๋ interface๋ฅผ ํธ์ถํ๋ค ์ฐ๋ฆฌ๊ฐ ์ํ๋ ํด๋์ค๋ฅผ ์ ์ดํ๊ธฐ์ํด ๋ชจ๋ธ ํด๋์ค์ ๋ชจ๋ ์ธ์คํด์ค ์ธํธ์ ์๋
๊ธฐ๋ณธ ๋ชจ๋ธ ๋งค๋์ ๋ฅผ ์ ๊ณตํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ์ ์ํ ์๋ ์๋ค. ์ด๋ ๊ธฐ์กด ๋ชจ๋ธ ๋งค๋์ ๋ฅผ ๊ต์ฒดํ๋ ๊ฒ์ด ์ข์๋ณด์ด๋๋ฐ ์ด ๋ฐฉ๋ฒ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผํ๊ณ ๋ชจ๋ธ ํด๋์ค์์ objects = models.Manager()์ ์ปค์คํ ๋ชจ๋ธ ๋งค๋์ ์์ ์ ์ํด์ฃผ์
๊ฑฐ๋ ๋ชจ๋ธ ์ดํดํ๊ธฐ
๊ฑฐ๋๋ชจ๋ธ์ ๋ฐ์ดํฐ ๊ด๋ จ ์ฝ๋๋ฅผ ๋ทฐ๋ ํ ํ๋ฆฟ์ ๋ฃ๊ธฐ ๋ณด๋ค ๋ชจ๋ธ ๋ฉ์๋, ํด๋์ค ๋ฉ์๋, ํน์ฑ, ์ฌ์ง์ด๋ ๋งค๋์ ๋ฉ์๋ ์์ ๋ฃ์ด์ ์บก์ํ ํ๋๊ฒ
์ด๋ด๊ฒฝ์ฐ ์ด๋ค ๋ทฐ๋ ๋ค๋ฅธ ์์ ์ด๋ผ๋ ๋ก์ง์ ์ด์ฉํ ์ ์๊ธฐ๋๋ฌธ์ด๋ค. ์ฆ ๊ฑฐ๋๋ชจ๋ธ์ ์ฝ๋์ฌ์ฌ์ฉ์ ๊ฐ์ ํ ์ ์๋ ์ต๊ณ ์ ๋ฐฉ๋ฒ์ด๋ค
๊ทธ๋ฐ๋ฐ! ๋ชจ๋ ๋ก์ง์ ๋ชจ๋ธ ์์ผ๋ก ๋ฃ์ผ๋ ค๋๋ฐ ๋ฐ๋ฅด๋ ๋ฌธ์ ์ ์ ๋ชจ๋ธ์ ํฌ๊ธฐ๋ฅผ ํํ ์ ์ ๊ฐ์ฒด (god object)์์ค์ผ๋ก ์ฆ๊ฐ์ํค๋๋ฐ ์๋ค. ์ด๋ฐ๊ฒฝ์ฐ ์ดํด๋ ์ด๋ ต๊ณ ํ ์คํธ, ์ ์ง๋ณด์๋ ์ด๋ ค์์ง๋ค
๋ฐ๋ผ์ ๋ก์ง์ ๋ชจ๋ธ๋ก ์ด์ ํ ๋ ๊ฐ์ฒด์งํฅ์ ์์ด๋์ด๋ฅผ ์ผ๋ํด๋๋ฉฐ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ์ ์ฆ ๋ก์ง๋ค์ ๋ชจ๋ธ ํ๋์ด๋ ์ํ์๋ ํฌํผํจ์๋ก ์ด์ ํ๋ค(ํด๋์ค๋ฉ์๋,๋ฉ์๋,ํน์ฑ์ ์ ์ง)
๋ชจ๋ธ ํ๋
๋ฏน์ค์ธ์ ํตํ ์บก์ํ์ ๊ตฌ์ฑํ์ ๊ฐ๋ ์ผ๋ก ์ด๋ฃจ์ด์ก๋ค ๋ชจ๋ธ์ ์ถ์ํ ๋ชจ๋ธ๋ก๋ถํฐ ๋ก์ง์ ์์
์ํ์๋ ํฌํผํจ์
๋ชจ๋ธ๋ก๋ถํฐ ๋ก์ง์ ๋ผ์ด๋ด ์ ํธํจ์๋ก ๋ฃ์ผ๋ฉด ๋ ๋ฆฝ์ ์ธ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํด์ง๊ณ ํ ์คํธ๊ฐ ์ฌ์์ง๋ค ๋จ ์์ ์ ์ํ๋ฅผ ์๊ฐ์ง๊ธฐ์ ๋ง์ ์ธ์๋ฅผ ํ์๋ก ํ๋ค
์ ๋ฆฌํ๋ฉด์ ์ฆ ๋ชจ๋ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ทํ๋ฅผ ํ๊ณ ๋ค๋ฅธ ์ ํ์ง๋ฅผ ๊ณ ๋ คํด ๋ด์๋ ์์ผ๋ฉด ๋น์ ๊ทํ๋ฅผ ํ์ ๊ทธ๋ฆฌ๊ณ index๋ฅผ ์ฌ์ฉํ์(ํ๋ก์ ํธ ์ ๋ฐ์ ๋ฐ์ดํฐ ์ด์ฉ์ด ์ต์ํด ์ก๋ค๋ฉด) ์์์ ํ๋ คํ๋ฉด ๋ฉํฐ ๋ชจ๋ธ์ด ์๋ ์ถ์ํ ๊ธฐ์ด ํด๋์ค๋ก ์์ํ์ null๊ณผ blank ์ต์ ์ ์ฃผ์ํด์ ์ฌ์ฉํ์ django-model-utils ์ django-extensions๋ฅผ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์๋ ์์๊ฒ ๊ฑฐ๋ ๋ชจ๋ธ ๋ํ ์ฃผ์ํด์ ์ฌ์ฉํ์