A model is the single, definitive source of information about your data. It contains the essential fields and behaviors of the data you’re storing.
Generally, each model maps to a single database table.
The basics
- Each model is a Python class that subclasses
django.db.models.Model
. - Each attribute of the model represents a database field.
- With all of this, Django gives you an automatically-generated database-access API
Quick example
This example model defines a Person
, which has a first_name
and last_name
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
first_name
and last_name
are fields of the model. Each field is specified as a class attribute, and each attribute maps to a database column.
The above Person
model would create a database table like this:
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
Some technical notes:
- The name of the table,
myapp_person
, is automatically derived from some model metadata but can be overridden. See Table names for more details. - An
id
field is added automatically, but this behavior can be overridden. See Automatic primary key fields. - The
CREATE TABLE
SQL in this example is formatted using PostgreSQL syntax, but it’s worth noting Django uses SQL tailored to the database backend specified in your settings file.
Using models
Once you have defined your models, you need to tell Django you’re going to use those models. Do this by editing your settings file and changing the INSTALLED_APPS
setting to add the name of the module that contains your models.py
.
For example, if the models for your application live in the module myapp.models
(the package structure that is created for an application by the manage.py startapp
script), INSTALLED_APPS
should read, in part:
INSTALLED_APPS = [
#...
'myapp',
#...
]
When you add new apps to INSTALLED_APPS
, be sure to run manage.py migrate
, optionally making migrations for them first with manage.py makemigrations
.