Intro
Django λͺ¨λΈ ν΄λμ€μ λ¬Έμμ΄ κΈ°λ° νλμ blank λλ null μ΅μ
μ μ§μ νλ 쑰건μ λν΄ μμλ³΄κ² μ΅λλ€.
Known Fact
μ²μ Djangoλ₯Ό μ νκ³ Django κ΄λ ¨ λ΄μ©μ κ²μ νλ€λ³΄λ©΄, Vitor Freitasμ SimpleIsBetterThanComplexλΌλ λΈλ‘κ·Έλ₯Ό μμ£Ό λ³Ό μ μμ΅λλ€.
μ΄λ³΄μλ€μκ² μ μ©ν λ΄μ©μ΄ λ§μ λ§€μ° μ’μ λΈλ‘κ·Έμ
λλ€.
μ λΈλ‘κ·Έμ λͺ¨λΈμ λ¬Έμμ΄ νλ μ΅μ
μΌλ‘ blankμ nullμ μ΄λ»κ² μ§μ ν΄μΌ νλμ§ μ μ€λͺ
λμ΄ μμ΅λλ€.
μλ¬Έμ κ°λ¨νκ² μμ½νλ©΄ λ€μκ³Ό κ°μ΅λλ€:
β’
blank: Validationκ³Ό κ΄λ ¨ μμ΅λλ€. Form(λλ Serializer)μ κ°μ νμλ‘ μ
λ ₯ν΄μΌ νλμ§ μλμ§
β’
null: λ°μ΄ν°λ² μ΄μ€μ κ΄λ ¨ μμ΅λλ€. λ°μ΄ν°λ² μ΄μ€μ columnμ null κ°μ νμ©ν κ²μΈμ§ μλμ§
λ¬Έμμ΄ κΈ°λ°μ νλ(CharFieldμ TextField λ±)μ null=True μ΅μ
μ μ£Όμμ λ, ν΄λΉ νλμ λ°μ΄ν°κ° μλ μν©μ λ κ°μ§(λΉ λ¬Έμμ΄ λλ null)λ‘ ν΄μν μ μκΈ° λλ¬Έμ null=True μ¬μ©μ μ§μνλΌκ³ ν©λλ€.
CharFieldμ λ°μ΄ν°κ° μλ μνλ₯Ό λΉ λ¬Έμμ΄('')λ‘ λνλ΄λ κ²μ΄ Django Conventionμ
λλ€.
Avoid using null on string-based fields such as CharField and TextField. If a string-based field has null=True, that means it has two possible values for βno dataβ: NULL, and the empty string. In most cases, itβs redundant to have two possible values for βno data;β the Django convention is to use the empty string, not NULL. β Django docs
κ·Έλ λ€λ©΄ λ¬Έμμ΄ κΈ°λ° νλμ λν΄ μ λλ‘ null=Trueλ₯Ό μ¬μ©ν΄μλ μ λλ κ² μΌκΉμ?
Deep Dive
ν΄λν° λ²νΈλ₯Ό μ μ νλ‘νμ μΆκ°νλ€κ³ ν΄λ³΄κ² μ΅λλ€.
λ΄λΆ μ μ±
μ μν΄ ν΄λν° λ²νΈ μ
λ ₯μ΄ νμλ μλμ§λ§, ν΄λν° λ²νΈλ λ°λμ unique νλ€κ³ κ°μ ν©μλ€.
νμ μ
λ ₯μ΄ μλλΌλ κ²μ΄ μ€μν©λλ€! ν΄λΉ κ°μ΄ νμλΌλ©΄ blank=Falseλ‘ μ§μ νλ©΄ κ·Έλ§μ
λλ€.
ν΄λν° λ²νΈλ CharFieldλ‘ μ μ₯ν κ²μ΄κΈ° λλ¬Έμ null=True λμ blank=Trueλ§ μ μ©ν©μλ€:
class UserProfile(models.Model):
...
mobile = models.CharField(max_length=11, unique=True, blank=True)
Python
볡μ¬
μμ μ½λλ‘ migrationμ μ μ©νλ €κ³ νλ©΄, unique constraint violationsκ° λ°μν©λλ€.
μ½κ² λ§ν΄unique=True μ΅μ
μ΄ μΆ©λνλ€λ λ»μ
λλ€.
μμΈμ λΆμ ν΄λ΄
μλ€.
mobile νλλ blank=Trueμ΄κ³ null=False μ
λλ€.
λ°λΌμ μ
λ ₯μ΄ μμΌλ©΄ Djangoλ ν΄λΉ νλμ κ°μ λΉ λ¬Έμμ΄("")λ‘ μ·¨κΈν©λλ€.
λ¬Έμ λ unique=True μ΅μ
μΌλ‘ μΈν΄, λ€μμ λΉ λ¬Έμμ΄('')μ κ°λ νμ΄ μ‘΄μ¬ν μ μμ΅λλ€.
μμ νλμ μ
λ ₯μ΄ νμκ° μλκΈ° λλ¬Έμ unique=Trueμ μΆ©λνμ§ μλ λΉ κ°μ΄ νμ© λμ΄μΌν©λλ€.
λ°λΌμ μμ κ°μ μν©(blank=True & unique=True)μμλ null=Trueκ° λ°λμ νμν©λλ€.
class UserProfile(models.Model):
...
mobile = models.CharField(max_length=15, unique=True, blank=True, null=True)
Python
볡μ¬
λ€μμ null κ°μ unique constraint violationsμ κ±Έλ¦¬μ§ μμ΅λλ€.
λ€μμ nullμ΄ νμ©λλ μ΄μ λ nullμ νΉμ ν κ°μ΄ μλκΈ° λλ¬Έμ
λλ€.
A null should not be confused with a value of 0. A null value indicates a lack of a value, which is not the same thing as a value of zero. β Wikipedia(Null)
Conclusion
μ 리νλ©΄ λ€μκ³Ό κ°μ΅λλ€:
β’
λ¬Έμμ΄ κΈ°λ° νλμλ λΉ κ°μ λνλ΄κΈ° μν΄ null=True λμ blank=Trueλ₯Ό μ¬μ©νμ.
β’
λ€λ§ unique=TrueμΈ κ²½μ°μ λΉ κ°μ νμ©ν΄μΌ νλ€λ©΄ null=Trueκ° λ°λμ νμνλ€.