One of the commonly used field options when creating models in Django is blank=True and null=True. Both options allow the field to be left empty, but they differ in purpose and functionality. This article explains what each option means, their differences, and how and when to use them.


1. blank=True

The blank=True option determines whether the field can be left empty during the form validation stage. This is primarily related to Django forms.

  • Meaning: Allows the field to be empty without causing validation errors in the form.
  • Usage Scenario: Used when you want to permit the field to be empty when receiving input from users. For instance, in user profile information, if a certain field is not mandatory and does not need to be filled out by the user, you would use blank=True.
from django.db import models

class Profile(models.Model):
    bio = models.TextField(blank=True)  # Optional bio field for the user

2. null=True

null=True allows the field's value to be NULL in the database. In other words, it determines whether an empty value is permissible at the database level.

  • Meaning: Permits the field to have a NULL value in the database.
  • Usage Scenario: Used when you need to handle cases where the value stored in the database could be empty. If null=True is not specified for non-string fields, Django will save a default value instead of an empty value. For example, if you want to treat the absence of a value in a date or numeric field as NULL, you would set null=True.
from django.db import models

class Event(models.Model):
    end_date = models.DateTimeField(null=True)  # Field to allow events without an end date

3. Difference Between blank=True and null=True

The difference between the two options mainly lies in form validation and database storage behavior.

Option Description Purpose
blank=True Allows the field to be left empty during form validation Is not required for user input
null=True Allows NULL values in the database Allows the field to be empty in the database

You can think of blank=True as allowing an empty field at the form level, while null=True allows for an empty field at the database level.


4. When to Use Both Options Together?

Typically, for string fields (e.g., CharField, TextField), only blank=True is set, and null=True is not. Django treats an empty string ('') and NULL value as separate in string fields, so it is common to handle an empty string instead of NULL.

On the other hand, for non-string fields (e.g., DateTimeField, IntegerField), if a field is not mandatory, it is recommended to use both blank=True and null=True together. This allows the field to be left empty in the form and will store NULL in the database.

class Task(models.Model):
    name = models.CharField(max_length=200, blank=True)   # String field with only blank=True
    due_date = models.DateTimeField(blank=True, null=True) # Date field using both blank=True and null=True

5. Summary and Conclusion

  • blank=True: Prevents errors from occurring when a field is left empty in the form. Mainly used when user input is not required.
  • null=True: Allows fields in the database to have NULL values. Used for non-string fields.
  • Using Together: Use blank=True and null=True together to allow optional empty values in non-string fields.

When designing Django models, appropriately utilizing these two options can help improve the flexibility of database structures and user inputs.

In the next post, we will explore the commonly used related_name field option in ForeignKey settings. This is also a very useful option in ORM, so I hope you'll look forward to the next post.