Model
π‘ Model
π λͺ¨λΈ μ μ
ν μ΄λΈμ 컬λΌμ λͺ¨λΈν΄λμ€μ μμ±μΌλ‘ μ μνκ³ , ν μ΄λΈμλ λ©μλκ° μμ§λ§
λͺ¨λΈ ν΄λμ€μλ λ©μλλ₯Ό μ μν μ μλ€. μ΄λ κ² ν¨μΌλ‘μ¨ ν μ΄λΈμ κ΄λ ¨λ
λ°μ΄ν°μ νμλ₯Ό λͺ¨λ λͺ¨λΈν΄λμ€ ν κ³³μ μ μν μ μλ μ₯μ μ΄ μλ€.
π λͺ¨λΈ μμ±
ORM κΈ°λ²μ νΉμ§μ λ°λΌ ν μ΄λΈμ 컬λΌμ λͺ¨λΈν΄λμ€μ μμ±μΌλ‘ μ μνλ€.
μ₯κ³ μμλ ν μ΄λΈμ 컬λΌμ βν μ΄λΈμ νλβ λλ βλͺ¨λΈμ νλβλΌκ³ νλλ°,
κ²°κ΅ λͺ¨λΈμ νλλ€μ λͺ¨λΈ ν΄λμ€μ μμ±μΌλ‘ μ μλκ³ λͺ¨λΈ ν΄λμ€μ μμ±λ€μ
ν μ΄λΈμ 컬λΌμΌλ‘ 1:1 맀νλλ€.
λ°λΌμ λͺ¨λΈν΄λμ€μ μμ± μ€μμ λͺ¨λΈ νλλ κ°μ₯ μ€μν μμ±μ΄λ©° νμμ΄λ€.
컬λΌμΌλ‘ ν μ΄λΈμ μ μνλ―μ΄ λͺ¨λΈ νλλ‘ λͺ¨λΈ ν΄λμ€λ₯Ό μ μνλ κ²μ΄λ€.
λͺ¨λΈν΄λμ€μμ νλλ₯Ό μ μνκΈ° μν΄μλ νλλͺ , νλ νμ κ³Ό νλμ΅μ μ μ§μ ν΄μ€μΌνλ€.
νλ νμ μ μν μ μλμ κ°λ€.
οΌ. ν μ΄λΈμ μ»¬λΌ νμ μ μ§μ νλ€.
οΌ. νΌμΌλ‘ λ λλ§λλ κ²½μ°, HTML μμ ―μ μ§μ νλ€.
οΌ. νλ λλ νΌμ λν μ ν¨μ± κ²μ¬ μ μ΅μ κΈ°μ€μ΄ λλ€.
οΌ. κ° νλ νμ μ λν λΆκ°μ μΈ μ΅μ μ΄ μ μ© κ°λ₯νλ€.
π λͺ¨λΈ λ©μλ
ν μ΄λΈμλ λ©μλκ° μμ§λ§ λͺ¨λΈ ν΄λμ€μμλ λ©μλλ₯Ό μ μν μ μλ€.
μ¬κΈ°μ μ£Όμν μ μ ν΄λμ€ λ©μλμ κ°μ²΄ λ©μλλ₯Ό ꡬλΆνλ κ²μ΄λ€.
ν΄λμ€ λ©μλλ ν μ΄λΈ λ 벨μμΈ λμνλ λ©μλμ΄κ³ , κ°μ²΄ λ©μλλ λ μ½λ
λ 벨μμ λμνλ λ©μλμ΄λ€. Djangoμμλ ν΄λμ€ λ©μλλ₯Ό μ¬μ©νμ§ μκ³
κ°μ²΄ λ©μλλ§ μ¬μ©νλ€. μ¦ λͺ¨λΈ ν΄λμ€μ μ μνλ λ©μλλ λͺ¨λ κ°μ²΄ λ©μλμ΄κ³
νμ self μΈμλ κ°κ³ μμΌλ©°, μ΄ λ©μλλ€μ νΈμΆνλ©΄ ν μ΄λΈ λ¨μκ° μλλΌ
λ μ½λ λ¨μμλ§ μν₯μ λ―ΈμΉλ€.
# κ°μ²΄μ λ¬Έμμ΄ β μ½κΈ° μ½κ²
def __str__(self):
pass
# DetailViewμ 맀νλ URLμ ꡬν λ
def get_absolute_url(self):]
pass
def get_next_by_FieldName(**kwargs):
pass
def get_previous_by_FieldName(**kwargs):
pass
π Meta λ΄λΆ ν΄λμ€ μμ±
Meta λ΄λΆ ν΄λμ€λ₯Ό μ μν΄ λͺ¨λΈμ λν λ©νλ°μ΄ν°λ₯Ό μ μν μ μλ€. Djangoμμλ
λͺ¨λΈ ν΄λμ€μ νλλ μλμ§λ§ λͺ¨λΈ ν΄λμ€μ νμν νλͺ©μ Meta λ΄λΆ ν΄λμ€μ μ μνλ€.
βπΌMeta Options
βͺ verbose_name : μ¬μ©μκ° μ΄ν΄νκΈ° μ¬μ΄ λͺ¨λΈ κ°μ²΄μ λ³μΉ.
βͺ verbose_name_plural : verbose_nameμ λν 볡μ λͺ μΉμ μ§μΉ.
π Manager μμ±
λͺ¨λ λͺ¨λΈμ λ°λμ Manager μμ±μ κ°μ ΈμΌ νλ€. λ§μΌ λͺ¨λΈμ μ μν λ λͺ μμ μΌλ‘
μ§μ νμ§ μμΌλ©΄, Manager λν΄νΈ μ΄λ¦μ objects
κ° λλ€.
λν Manager μμ±μ λͺ¨λΈ ν΄λμ€λ₯Ό ν΅ν΄μλ§ μ κ·Όν μ μκ³ , λͺ¨λΈ κ°μ²΄λ₯Ό ν΅ν΄μλ
μ κ·Όν μ μλ€.
qs = Job.objects.all()
λν λͺ¨λΈ ν΄λμ€μμ Manager μμ±μ μ¬λ¬ κ° μ μν μ μλ€.
# λ λ²μ§Έ Manager μ μ
class SecondAlbumManager(models.Model):
def get_queryset(self):
return super().get_queryset().filter(owner__username='Tom')
class Album(models.Model):
name = models.CharField('NAME', max_length=30)
owner = models.ForeignKey('auth.User', on_delete=models.CASCADE,
verbose_name='OWNER', blank=True, null=True)
objects = models.Manager()
second_objects = SecondAlbumManager()
π λͺ¨λΈ κ° κ΄κ³
1:N (One-to-Many)
ν μ΄λΈ κ°μ 1:N κ΄κ³λ₯Ό λ§ΊκΈ° μν΄μλ λͺ¨λΈμ νλλ₯Ό μ μν λ Foreign Key νλ νμ μ
NμΈ‘μ μ§μ ν΄ μ€μΌνλ€. μλνΈ λͺ¨λΈμμμ κ΄κ³λ Djangoκ° μμμ μ μν΄ μ€λ€.
N:N (Many-to-Many)
ν μ΄λΈ κ°μ N:N κ΄κ³λ₯Ό λ§ΊκΈ° μν΄μλ λͺ¨λΈμ νλλ₯Ό μ μν λ ManytoManyField νμ μ
μ§μ ν΄ μ€μΌνλ€. λ λͺ¨λΈ μ€ ν μͺ½μλ§ μ μν΄ μ£Όλ©΄ λλ€.
1:1 (One-to-One)
ν μ΄λΈ κ°μ 1:1 κ΄κ³λ₯Ό λ§ΊκΈ° μν΄μλ λͺ¨λΈμ νλλ₯Ό μ μν λ OnetoOneField νμ μ
μ§μ ν΄ μ€μΌνλ€. λ λͺ¨λΈ μ€ ν μͺ½μλ§ μ μν΄ μ£Όλ©΄ λλ€.
κ°λ μ μΌλ‘λ OnetoOneField νλ νμ μ Foreign Key νλ νμ μ unique=True μ΅μ μ
μ€ κ²κ³Ό μ μ¬νλ€. λ€λ§ λ°λ λ°©ν₯μ λμμ λ€λ₯΄λ€. Foreign Key κ΄κ³μμ λ°λ λ°©ν₯μ
κ°μ²΄λ 볡μ κ°μ κ°μ²΄λ₯Ό λ°ννμ§λ§, OnetoOneField κ΄κ³μμ λ°λ λ°©ν₯μ κ°μ²΄λ
νλμ κ°μ²΄λ§ λ°ννλ μ μ΄ λ€λ₯΄λ€.
κ΄κ³ 맀λμ (Related Manager)
Manager ν΄λμ€λ λ°μ΄ν°λ² μ΄μ€μ λν μ²λ¦¬, μ¦ λ°μ΄ν°λ² μ΄μ€μ 쿼리λ₯Ό 보λ΄κ³
κ·Έ μλ΅μ λ°λ μν μ λ΄λΉνλ€. 맀λμ μ€μμ λͺ¨λΈ κ° κ΄κ³μ λν κΈ°λ₯ λ°
λ°μ΄ν°λ² μ΄μ€ 쿼리λ₯Ό λ΄λΉνλ ν΄λμ€λ₯Ό κ΄κ³ 맀λμ (Related Manager)λΌ νλ€.
class Album(models.Model):
name = models.CharField('NAME', max_length=30)
owner = models.ForeignKey('auth.User', on_delete=models.CASCADE,
verbose_name='OWNER', blank=True, null=True)
μ μ½λμ κ²½μ° NμΈ‘μμ 1μΈ‘μΌλ‘ μ κ·Όν λ Related Managerλ₯Ό μ¬μ©νλ€.
βͺ 1 β N : user1.album_set (Related Manager)
βͺ N β 1 : album1.owner (Foreign Key νλλͺ )
βπΌ Related Manager μ€λ³΅