Field type selection guide: CharField vs TextField, JSONField, ArrayField, etc. Use when: choosing field types, configuring field options, using PostgreSQL-specific fields.
class Campaign(TimestampedModel):
start_at = models.DateTimeField()
end_at = models.DateTimeField(null=True, blank=True) # null OK for optional dates
launch_date = models.DateField(null=True, blank=True)
File Fields
class FirmwareFile(TimestampedModel):
file = models.FileField(upload_to="firmwares/%Y/%m/")
image = models.ImageField(upload_to="images/", blank=True)
# Always validate MIME type and size in services.py before saving
null vs blank Cheat Sheet
Field Type
null=True
blank=True
Correct Pattern
CharField / TextField
NO
Yes
blank=True, default=""
IntegerField
Yes (if optional)
Yes
null=True, blank=True
ForeignKey
Yes (if optional)
Yes
null=True, blank=True, on_delete=SET_NULL
DateTimeField
Yes (if optional)
Yes
null=True, blank=True
BooleanField
NO
No
default=False
JSONField
NO
Yes
default=dict, blank=True
Anti-Patterns
null=True on CharField / TextField — use default="" instead
FloatField for prices or currency — always DecimalField
Missing related_name on FK/M2M — causes clash errors
CharField for IP addresses — use GenericIPAddressField