FrontEnd
Javascript
Diary
ML
CS
Django
Algorithm
AWS
Co-Work
HTML
CSS
Python
React
ReactNative

Django Model(์‹ฌํ™”)

๐Ÿ’พ Django ์žฅ๊ณ ์—์„œ ๋ชจ๋ธ ์ด์šฉํ•˜๊ธฐ

๋ชจ๋ธ์ž‘์—…์„ ํ•˜๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ ์ด์šฉํ•˜๋Š” ์žฅ๊ณ  ํŒจํ‚ค์ง€

django-model-utils: TimeStampedModel ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์ด์šฉ

django-extensions : ๋ชจ๋“  ์•ฑ์— ๋ชจ๋ธํด๋ž˜์Šค๋ฅผ ์ž๋™์œผ๋กœ ๋กœ๋“œํ•ด์ฃผ๋Š” shell_plus๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ๊ด€๋ฆฌ๋ช…๋ น ์ œ๊ณต ๋‹จ์ ์€ ์ž‘์ง€๋งŒ ์—ญํ• ์ด ๋ถ„๋ช…ํ•œ ์•ฑ ๊ฐœ๋…์— ๋งž์ง€์•Š๊ฒŒ ๋„ˆ๋ฌด ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ

๋ชจ๋ธ์€ ์žฅ๊ณ  ํ”„๋กœ์ ํŠธ์˜ ํ† ๋Œ€๊ฐ€ ๋˜๋Š” ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค ๋”ฐ๋ผ์„œ ๋ชจ๋ธ์˜ ์ƒ์„ฑ๊ณผ ์ˆ˜์ •์—์„œ๋Š” ๋‹ค์Œ์˜ ๊ฐœ๋…๋“ค์„ ์ƒ๊ฐํ•ด์ฃผ๋„๋ก ํ•˜์ž


  • ์‹œ์ž‘ํ•˜๊ธฐ
  • ๋ชจ๋ธ์ด ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด ์•ฑ์„ ๋‚˜๋ˆˆ๋‹ค(1๊ฐœ์˜ ์•ฑ๋‹น ๋ชจ๋ธ์€ 5๊ฐœ๋ฅผ ๋„˜์ง€์•Š์•„์•ผํ•œ๋‹ค)
  • ๋ชจ๋ธ ์ƒ์†์— ์ฃผ์˜ํ•˜์ž

๋งŒ์•ฝ ์ƒ์†์„ ํ•˜์ง€์•Š๋Š”๋‹ค๋ฉด? ๋ชจ๋ธ๋“ค ์‚ฌ์ด์— ๊ณตํ†ตํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๋‘ ๋ชจ๋ธ์— ์ „๋ถ€ ํ•„๋“œ๋ฅผ ์ƒ์„ฑ

  • ์žฅ์  : DB Table์— ์–ด๋–ค์‹์œผ๋กœ Mapping๋˜๋“ ์ง€ ์ƒ๊ด€์—†์ด ํ•œ๋ˆˆ์— ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑ
  • ๋‹จ์  : ์ค‘๋ณต๋˜๋Š” Table์ด ๋งŽ์„๊ฒฝ์šฐ ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€

  • ๋ชจ๋ธ์˜ ์ƒ์†
  • ์ถ”์ƒํ™”๊ธฐ์ดˆํด๋ž˜์Šค(abstract base class)(ํŒŒ์ด์ฌ๊ณผ ๋‹ค๋ฅด๋‹ค) (๋ชจ๋ธ์‚ฌ์ด์˜ ์ค‘๋ณต๋œํ•„๋“œ๊ฐ€ ๋งŽ์„๋•Œ)

์˜ค์ง ์ƒ์†๋ฐ›์•„ ์ƒ์„ฑ๋œ ๋ชจ๋ธ๋“ค์˜ ํ…Œ์ด๋ธ”๋งŒ ์ƒ์„ฑ

  • ์žฅ์  : ์ถ”์ƒํ™”๋œ ํด๋ž˜์Šค์— ๊ณตํ†ต๋ถ€๋ถ„์„ ์ถ”๋ ค๋†“์•„ ํ•œ๋ฒˆ๋งŒ ํƒ€์ดํ•‘์„ ํ•˜๋ฉด ๋œ๋‹ค. ์ถ”๊ฐ€ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜์ง€์•Š๊ณ  ์—ฌ๋Ÿฌํ…Œ์ด๋ธ”์— ์กฐ์ธํ•จ์œผ๋กœ์จ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์—†๋‹ค
  • ๋‹จ์  : ๋ถ€๋ชจํด๋ž˜์Šค๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์ด์šฉํ• ์ˆ˜ ์—†๋‹ค

๊ณตํ†ต ํ•„๋“œ๋ถ€๋ถ„์„ ์ถ”์ƒํ™” ๊ธฐ์ดˆ๋ชจ๋ธ๋กœ ์ด์ „ํ•˜๋Š” ๋ฆฌํŒฉํ„ฐ๋ง ์ž‘์—…์š”๊ตฌ

  1. ๋ฉ€ํ‹ฐ ํ…Œ์ด๋ธ” ์ƒ์†(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๋ฅผ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ• ์ˆ˜๋„ ์žˆ์„๊ฒƒ ๊ฑฐ๋Œ€ ๋ชจ๋ธ ๋˜ํ•œ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž