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 쀑볡