Django model data types and fields list
Django models represent the structure of your database tables, and fields are the core components of those models. Fields define the type of data each database column can hold and how it should behave. This article covers all major Django model field types and their usage.
Defining Fields in a Model
Each field in a Django model is specified as a class attribute, and its type is determined by using a specific Django field class like CharField, IntegerField, etc.
- Model Definition Location: All your model definitions should go inside the models.py file of your Django app.
- Avoid Reserved Names: Don't use reserved names like save, delete, or clean as field names, as these conflict with Django's model API and can lead to unexpected behavior.
Example:
from django.db import models
class Musician(models.Model):
first_name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
instrument = models.CharField(max_length=200)
class Album(models.Model):
artist = models.ForeignKey(Musician, on_delete=models.CASCADE) # Links each album to a musician
name = models.CharField(max_length=100) # Album name
release_date = models.DateField() # Release date of the album
num_stars = models.IntegerField() # Rating (e.g., out of 5)
After creating and applying migrations we can see that the above two tables have been created in the database:


Explanation of fields used in the above example:
- CharField is used for short text like names or instruments.
- IntegerField stores numbers (e.g., star ratings).
- DateField holds date values.
- ForeignKey establishes a relationship between two models (Album- Musician).
Role of Model Fields
Fields define the data type for each model attribute. Built-in validation ensures you can’t store the wrong type (e.g., text in an IntegerField).
Each Django field class helps Django determine:
- The database column type (e.g., INTEGER, VARCHAR, TEXT)
- The default HTML form widget (e.g., <input type="text">, <select>, etc.)
- The built-in validation rules for that field
Django supports many built-in field types which can be used to save any type of data from number to entire HTML file too. Here is a list of all Field types used in Django.
Common Field Types in Django
Field Name | Description |
---|---|
AutoField | It is an IntegerField that automatically increments. |
BigAutoField | It is a 64-bit integer, much like an AutoField except that it is guaranteed to fit numbers from 1 to 9223372036854775807. |
BigIntegerField | It is a 64-bit integer, much like an IntegerField except that it is guaranteed to fit numbers from -9223372036854775808 to 9223372036854775807. |
BinaryField | A field to store raw binary data. |
BooleanField | A true/false field. The default form widget for this field is a CheckboxInput. |
CharField | A field to store text-based values. |
DateField | A date, represented in Python by a datetime.date instance |
DateTimeField | It is used for date and time, represented in Python by a datetime.datetime instance. |
DecimalField | It is a fixed-precision decimal number, represented in Python by a Decimal instance. |
DurationField | A field for storing periods of time. |
EmailField | It is a CharField that checks that the value is a valid email address. |
FileField | It is a file-upload field. |
FloatField | It is a floating-point number represented in Python by a float instance. |
ImageField | It inherits all attributes and methods from FileField, but also validates that the uploaded object is a valid image. |
IntegerField | It is an integer field. Values from -2147483648 to 2147483647 are safe in all databases supported by Django. |
GenericIPAddressField | An IPv4 or IPv6 address, in string format (e.g. 192.0.2.30 or 2a02:42fe::4). |
NullBooleanField | Like a BooleanField, but allows NULL as one of the options. |
PositiveIntegerField | Like an IntegerField, but must be either positive or zero (0). |
PositiveSmallIntegerField | Like a PositiveIntegerField, but only allows values under a certain (database-dependent) point. |
SlugField | Slug is a newspaper term. A slug is a short label for something, containing only letters, numbers, underscores or hyphens. They’re generally used in URLs. |
SmallIntegerField | It is like an IntegerField, but only allows values under a certain (database-dependent) point. |
TextField | A large text field. The default form widget for this field is a Textarea. |
TimeField | A time, represented in Python by a datetime.time instance. |
URLField | A CharField for a URL, validated by URLValidator. |
UUIDField | A field for storing universally unique identifiers. Uses Python’s UUID class. When used on PostgreSQL, this stores in a uuid datatype, otherwise in a char(32). |
Relationship Fields
These fields define how models relate to each other.
Field Name | Description |
---|---|
ForeignKey | Defines a many-to-one relationship. Requires a target model and an on_delete behavior. |
ManyToManyField | Defines a many-to-many relationship. Accepts a target model and supports intermediate tables. |
OneToOneField | Defines a one-to-one relationship. Similar to ForeignKey with unique=True. |
Read Next Article: