Django

GreenBeanΒ·2021λ…„ 4μ›” 29일
post-thumbnail

Model Field

Fieldλž€?

ν•„λ“œλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ”μ—μ„œ μ—΄(column)을 μ˜λ―Έν•œλ‹€. Django μ—μ„œ ν•„λ“œλŠ” λͺ¨λΈμ„ 생성할 λ•Œ ν•„μˆ˜μ μΈ μš”μ†Œμ΄λ©°, λͺ¨λΈν΄λž˜μŠ€μ˜ μ†μ„±μœΌλ‘œ λ‚˜νƒ€λ‚Έλ‹€. ν•„λ“œλ₯Ό clean, save, delete λ“±κ³Ό 같이 λͺ¨λΈ API 와 λ™μΌν•œ μ΄λ¦„μœΌλ‘œ μƒμ„±ν•˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

class λͺ¨λΈμ΄λ¦„(models.Model):
    ν•„λ“œμ΄λ¦„1 = models.ν•„λ“œνƒ€μž…(ν•„λ“œμ˜΅μ…˜)
    ν•„λ“œμ΄λ¦„2 = models.ν•„λ“œνƒ€μž…(ν•„λ“œμ˜΅μ…˜)

Field νƒ€μž…

ν•„λ“œλŠ” Field 클래슀의 μΈμŠ€ν„΄μŠ€μ΄λ‹€. Django λŠ” ν•„λ“œλ₯Ό 톡해 λ‹€μŒκ³Ό 같은 사항을 μ •μ˜ν•œλ‹€.

  • ν…Œμ΄λΈ”μ˜ μ—΄ μ €μž₯ν•  λ°μ΄ν„°μ˜ μœ ν˜• (λ¬Έμžμ—΄, μ •μˆ˜ λ“±)
  • 폼 ν•„λ“œλ₯Ό λ Œλ”λ§ν•  λ•Œ μ‚¬μš©ν•  κΈ°λ³Έ HTML μœ„μ ―
  • κ΄€λ¦¬μž νŽ˜μ΄μ§€μ™€ μžλ™μƒμ„± λ˜λŠ” 폼듀에 적용될 μ΅œμ†Œ μš”κ΅¬μ‚¬ν•­
  • ν•„λ“œ νƒ€μž…

β†’ BooleanField
HTML μœ„μ ― : CheckboxInput
ν•„μˆ˜ μ˜΅μ…˜ : -
μ„€λͺ… : True/False 값을 κ°€μ§€λŠ” ν•„λ“œ.

β†’ CharField
HTML μœ„μ ― : TextInput
ν•„μˆ˜ μ˜΅μ…˜ : max_length
μ„€λͺ… : λ¬Έμžμ—΄ 데이터λ₯Ό μ €μž₯ν•˜λŠ” ν•„λ“œ. μ΅œλŒ€ κΈ€μž 수λ₯Ό λ°˜λ“œμ‹œ μ§€μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

β†’ DateField
HTML μœ„μ ― : TextInput
ν•„μˆ˜ μ˜΅μ…˜ : -
μ„€λͺ… : datetime.date μΈμŠ€ν„΄μŠ€μΈ λ‚ μ§œ 데이터λ₯Ό μ €μž₯ν•˜λŠ” ν•„λ“œ. 달λ ₯ μœ„μ ―κ³Ό 였늘 λ‚ μ§œ μž…λ ₯ κΈ°λŠ₯을 κΈ°λ³Έμ œκ³΅ν•œλ‹€.

β†’ DateTimeField
HTML μœ„μ ― : TextInput
ν•„μˆ˜ μ˜΅μ…˜ : -
μ„€λͺ… : datetime.datetime μΈμŠ€ν„΄μŠ€μΈ λ‚ μ§œμ™€ μ‹œκ°„ 데이터λ₯Ό μ €μž₯ν•˜λŠ” ν•„λ“œ. 두 개의 TextInput, 달λ ₯ μœ„μ ―, 였늘 λ‚ μ§œ μž…λ ₯ κΈ°λŠ₯을 κΈ°λ³Έμ œκ³΅ν•œλ‹€.

β†’ FloatField
HTML μœ„μ ― : NumberInput
ν•„μˆ˜ μ˜΅μ…˜ : -
μ„€λͺ… : Python의 floatκ³Ό 같은 μ‹€μˆ˜ 데이터λ₯Ό μ €μž₯ν•˜λŠ” ν•„λ“œ.

β†’ IntegerField
HTML μœ„μ ― : NumberInput
ν•„μˆ˜ μ˜΅μ…˜ : -
μ„€λͺ… : Python의 integerκ³Ό 같은 μ •μˆ˜ 데이터λ₯Ό μ €μž₯ν•˜λŠ” ν•„λ“œ. -2147483648κ³Ό 2147483647 μ‚¬μ΄μ˜ 값을 μ €μž₯ν•  수 μžˆλ‹€.

β†’ TextField
HTML μœ„μ ― : Textarea
ν•„μˆ˜ μ˜΅μ…˜ : -
μ„€λͺ… : κΈ€μž 수 μ œν•œμ΄ μ—†λŠ” λ¬Έμžμ—΄ 데이터λ₯Ό μ €μž₯ν•˜λŠ” ν•„λ“œ. max_length 값을 μ§€μ •ν•˜λ©΄ νΌμ—μ„œλŠ” μ œν•œμ΄ λ˜μ§€λ§Œ, λ°μ΄ν„°λ² μ΄μŠ€μ—λŠ” 영ν–₯을 μ£Όμ§€ μ•ŠμŒ.

  • 관계 μ •μ˜ ν•„λ“œ

β†’ Forignkey
ν•„μˆ˜ μ˜΅μ…˜ : to, on_delete
μ„€λͺ… : ν•„λ“œλ₯Ό μ™Έλž˜ν‚€λ‘œ μ„€μ •ν•œλ‹€. λ‹€λ₯Έ ν…Œμ΄λΈ”μ˜ λ ˆμ½”λ“œμ™€ μΌλŒ€λ‹€ 관계λ₯Ό ν˜•μ„±ν•œλ‹€. 관계 μ„€μ • λŒ€μƒμ΄ λ˜λŠ” λͺ¨λΈκ³Ό λ ˆμ½”λ“œ μ‚­μ œ μ‹œ 처리 방식을 ν•„μˆ˜λ‘œ μ„€μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

β†’ ManytoManyField
ν•„μˆ˜ μ˜΅μ…˜ : to
μ„€λͺ… : ν•„λ“œκ°€ λŒ€μƒ ν…Œμ΄λΈ”κ³Ό λ‹€λŒ€λ‹€ 관계λ₯Ό ν˜•μ„±ν•˜λ„λ‘ μ„€μ •ν•œλ‹€. 관계 μ„€μ • λŒ€μƒμ΄ λ˜λŠ” λͺ¨λΈμ„ ν•„μˆ˜λ‘œ μ„€μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

β†’ OneToOneField
ν•„μˆ˜ μ˜΅μ…˜ : to, on_delete
μ„€λͺ… : ν•„λ“œκ°€ λŒ€μƒ ν…Œμ΄λΈ”κ³Ό μΌλŒ€μΌ 관계λ₯Ό ν˜•μ„±ν•˜λ„λ‘ μ„€μ •ν•œλ‹€. 관계 μ„€μ • λŒ€μƒμ΄ λ˜λŠ” λͺ¨λΈκ³Ό λ ˆμ½”λ“œ μ‚­μ œ μ‹œ 처리 방식을 ν•„μˆ˜λ‘œ μ„€μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

  • ν•„λ“œ μ˜΅μ…˜
    λͺ¨λ“  ν•„λ“œμ—λŠ” μ—¬λŸ¬κ°€μ§€ 섀정을 λ³€κ²½ν•  수 μžˆλŠ” ν•„λ“œ μ˜΅μ…˜μ„ 지정해쀄 수 μžˆλ‹€.

β†’ null
True 이면 λ°μ΄ν„°λ² μ΄μŠ€μ— 빈 값을 null κ°’μœΌλ‘œ μ €μž₯ν•œλ‹€. 기본값은 False 이닀.

field = models.IntegerField(null=True)

β†’ blank
True 이면 ν•„λ“œκ°€ 빈 값을 받을 수 있게 λœλ‹€. 기본값은 False.

field = models.IntegerField(blank=True)

β†’ choices
길이가 2인 νŠœν”Œλ“€μ˜ 리슀트 ν˜Ήμ€ νŠœν”Œμ„ 선택지 λ³€μˆ˜λ‘œ μ§€μ •ν•  수 μžˆλ‹€. choices μ˜΅μ…˜μ— 선택지 λ³€μˆ˜λ₯Ό μ§€μ •ν•΄μ£Όλ©΄ λœλ‹€.

# 선택지 λ³€μˆ˜ 예
SHIRT_SIZES = (
      ('S', 'Small'),
      ('M', 'Medium'),
      ('L', 'Large'),
  )
field = models.CharField(max_length=1, choices=SHIRT_SIZES)

β†’ default
ν•„λ“œμ˜ 기본값을 μ§€μ •ν•΄μ€€λ‹€. ν•„λ“œμ— 아무것도 μž…λ ₯ν•˜μ§€ μ•Šμ„ 경우 기본값이 λ“€μ–΄κ°„λ‹€.

field = models.IntegerField(default=0)

β†’ help_text
ν•„λ“œμ— λŒ€ν•œ μ„€λͺ…을 μΆ”κ°€ν•  수 μžˆλ‹€. κ΄€λ¦¬μž νŽ˜μ΄μ§€μ—μ„œ 확인 κ°€λŠ₯.

company_name = models.CharField(max_length=10, help_text='Type company name here')

β†’ primary_key
ν•„λ“œλ₯Ό κΈ°λ³Έν‚€λ‘œ μ„€μ •ν•œλ‹€. κΈ°λ³Έν‚€λ₯Ό μ„€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ μžλ™μ μœΌλ‘œ κ³ μœ ν•œ μ •μˆ˜κ°’μ„ κ°€μ§€λŠ” id κΈ°λ³Έν‚€ ν•„λ“œκ°€ μƒμ„±λœλ‹€. κΈ°λ³Έν‚€ ν•„λ“œλŠ” μ½κΈ°μ „μš©μ΄λ©°, 값을 λ°”κΎΈλ©΄ κΈ°μ‘΄ λ ˆμ½”λ“œμ˜ κΈ°λ³Έν‚€ ν•„λ“œ 값이 λ°”λ€ŒλŠ” 것이 μ•„λ‹ˆκ³  λ°”κΎΈλ €λŠ” 값을 κΈ°λ³Έν‚€ κ°’μœΌλ‘œ κ°€μ§€λŠ” λ ˆμ½”λ“œκ°€ μƒˆλ‘œ μƒμ„±λœλ‹€.

name = models.CharField(max_length=100, primary_key=True)

β†’ unique
ν•„λ“œκ°€ 항상 κ³ μœ ν•œ κ°’λ§Œ 가지도둝 μ„€μ •ν•œλ‹€. λ™μΌν•œ ν•„λ“œ 값을 κ°€μ§€λŠ” λ ˆμ½”λ“œλ₯Ό μƒμ„±ν•˜λ €κ³  ν•  경우 IntegrityError κ°€ λ‚œλ‹€. ManyToManyField 와 OneToOneField μ—λŠ” μ‚¬μš©ν•  수 μ—†λ‹€.

β†’ verbose_name
관계섀정 ν•„λ“œλ₯Ό μ œμ™Έν•œ λͺ¨λ“  ν•„λ“œνƒ€μž…λ“€μ€ 첫 번째 μœ„μΉ˜ 인자둜 λ¬Έμžμ—΄μ„ 받을 수 μžˆλ‹€. 이 λ¬Έμžμ—΄μ€ ν•„λ“œλ₯Ό μ’€ 더 ꡬ체적으둜 λ‚˜νƒ€λ‚΄λŠ” 이름이 λœλ‹€. verbosename 을 μ„€μ •ν•˜μ§€ μ•ŠλŠ” 경우, κΈ°λ³Έκ°’μœΌλ‘œ λ₯Ό 곡백문자둜 μΉ˜ν™˜ν•œ λ³€μˆ˜μ΄λ¦„μ΄ verbose_name 이 λœλ‹€.

# verbose_name 은 'person's first name' 이 λœλ‹€.
# λ¬Έμžμ—΄μ„ μ „λ‹¬ν•˜μ§€ μ•ŠλŠ” 경우 verbose_name 은 'first name' 이 λœλ‹€.
first_name = models.CharField("person's first name", max_length=20)

ForignKey, OneToOneField, ManyToManyField λŠ” 첫 번째 μœ„μΉ˜μΈμžλ‘œ 관계 λŒ€μƒ λͺ¨λΈμ„ λ°›μœΌλ―€λ‘œ verbose_name μ΄λΌλŠ” ν‚€μ›Œλ“œ 인자둜 μ „λ‹¬ν•΄μ£Όμ–΄μ•Όν•œλ‹€.

poll = models.ForignKey(Poll, on_delete=models.CASCADE, verbose_name='the related poll')

κ΄€λ‘€μ μœΌλ‘œ verbose_name 의 첫 κΈ€μžλ₯Ό λŒ€λ¬Έμžλ‘œ ν‘œκΈ°ν•˜μ§€ μ•ŠλŠ”λ‹€. Django λŠ” 이 이름을 μ‚¬μš©ν•  λ•Œ μžλ™μœΌλ‘œ 첫 κΈ€μžλ₯Ό λŒ€λ¬Έμž ν‘œκΈ°ν•œλ‹€.

β†’ db_colmn
ν•„λ“œ 이름을 μ‚¬μš©μž 지정해쀄 수 μžˆλ‹€. 이 μ˜΅μ…˜μ΄ μ£Όμ–΄μ§€μ§€ μ•ŠλŠ” 경우 κΈ°λ³Έμ μœΌλ‘œλŠ” λͺ¨λΈμ˜ 속성 이름이 ν…Œμ΄λΈ”μ˜ ν•„λ“œ 이름이 λœλ‹€. 이 μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄ Python μ˜ˆμ•½μ–΄ 및 λ³€μˆ˜λͺ… μ œμ•½, ν•˜μ΄ν”ˆ(-), SQL μ˜ˆμ•½μ–΄ 등을 ν•„λ“œ μ΄λ¦„μœΌλ‘œ μ‚¬μš©ν•  수 있게 λœλ‹€.

# λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν•„λ“œ 이름은 db-field-name 둜 ν‘œμ‹œλœλ‹€.
field_name = models.CharField(max_length=30, db_colmn='db-field-name')

ν•„λ“œ 이름 μ œμ•½μ‚¬ν•­

  • Python μ˜ˆμ•½μ–΄λŠ” ν•„λ“œ μ΄λ¦„μœΌλ‘œ μ‚¬μš©ν•  수 μ—†λ‹€.
class Example(models.Model):
  pass = models.CharField(max_length=100)  # pass λŠ” Python μ˜ˆμ•½μ–΄μ΄λ‹€.
  • ν•„λ“œ 이름에 μ–Έλ”μŠ€μ½”μ–΄(_) 두 개λ₯Ό μ—°μ†μœΌλ‘œ μ“Έ 수 μ—†λ‹€. Django 의 쿼리 룩업 문법과 겹치기 λ•Œλ¬Έμ΄λ‹€.
class Example(model.Model):
  ex__field = models.CharField(max_length=100)  # ex__field λŠ” μ—°μ†λœ μ–Έλ”μŠ€μ½”μ–΄ 두 개λ₯Ό κ°€μ§€κ³  μžˆλ‹€.
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 λŒ“κΈ€