Hello Coders,
This article aims to help beginners to understand how to Create a Model in Django Framework by coding a new app from scratch and use mostly the terminal. The sample source code can be downloaded from Github (MIT License) and extended for hobby and commercial products. For newcomers, Django is a high-level Python Web framework built by experienced developers that encourages rapid development and clean, pragmatic design.
Thanks for reading! – Content provided by App Generator.
- Create Model in Django – source code (Github/MIT License)
- More Django Samples provided with authentication, basic modules
Let’s Code Django
Check Python Version – recommended version is Python3
<span>$ </span>python <span>--version</span>Python 3.8.4 <<span>--</span> All good, we have a 3.x version<span>$ </span>python <span>--version</span> Python 3.8.4 <<span>--</span> All good, we have a 3.x version$ python --version Python 3.8.4 <-- All good, we have a 3.x version
Enter fullscreen mode Exit fullscreen mode
Create/activate a virtual environment – Unix-based system
<span>$ </span>virtualenv <span>env</span><span>$ </span><span>source env</span>/bin/activate<span>$ </span>virtualenv <span>env</span> <span>$ </span><span>source env</span>/bin/activate$ virtualenv env $ source env/bin/activate
Enter fullscreen mode Exit fullscreen mode
For Windows, the syntax is slightly different
<span>$ </span>virtualenv <span>env</span><span>$ </span>.<span>\e</span>nv<span>\S</span>cripts<span>\a</span>ctivate<span>$ </span>virtualenv <span>env</span> <span>$ </span>.<span>\e</span>nv<span>\S</span>cripts<span>\a</span>ctivate$ virtualenv env $ .\env\Scripts\activate
Enter fullscreen mode Exit fullscreen mode
Install Django
<span>$ </span>pip <span>install </span>django<span>$ </span>pip <span>install </span>django$ pip install django
Enter fullscreen mode Exit fullscreen mode
Create a new Django Project
<span>$ </span><span>mkdir </span>django-create-model<span>$ </span><span>cd </span>django-create-model<span>$ </span><span>mkdir </span>django-create-model <span>$ </span><span>cd </span>django-create-model$ mkdir django-create-model $ cd django-create-model
Enter fullscreen mode Exit fullscreen mode
Inside the new directory, we will invoke startproject
subcommand:
<span>$ </span>django-admin startproject config <span>.</span><span>$ </span>django-admin startproject config <span>.</span>$ django-admin startproject config .
Enter fullscreen mode Exit fullscreen mode
Note: Take into account that .
at the end of the command.
Setup the database
<span>$ </span>python manage.py makemigrations<span>$ </span>python manage.py migrate<span>$ </span>python manage.py makemigrations <span>$ </span>python manage.py migrate$ python manage.py makemigrations $ python manage.py migrate
Enter fullscreen mode Exit fullscreen mode
Start the app
<span>$ </span>python manage.py runserver<span>$</span><span>$ </span><span># Access the web app in browser: http://127.0.0.1:8000/</span><span>$ </span>python manage.py runserver <span>$</span> <span>$ </span><span># Access the web app in browser: http://127.0.0.1:8000/</span>$ python manage.py runserver $ $ # Access the web app in browser: http://127.0.0.1:8000/
Enter fullscreen mode Exit fullscreen mode
At this point we should see the default Django page in the browser:
Create a new Django application
<span>$ </span>python manage.py startapp sample<span>$ </span>python manage.py startapp sample$ python manage.py startapp sample
Enter fullscreen mode Exit fullscreen mode
Visualize the default SQL settings – config/settings.py
<span># File: config/settings.py (partial content) </span><span>...</span><span>DATABASES</span> <span>=</span> <span>{</span><span>'</span><span>default</span><span>'</span><span>:</span> <span>{</span><span>'</span><span>ENGINE</span><span>'</span><span>:</span> <span>'</span><span>django.db.backends.sqlite3</span><span>'</span><span>,</span><span>'</span><span>NAME</span><span>'</span><span>:</span> <span>BASE_DIR</span> <span>/</span> <span>'</span><span>db.sqlite3</span><span>'</span><span>,</span><span>}</span><span>}</span><span>...</span><span># File: config/settings.py (partial content) </span><span>...</span> <span>DATABASES</span> <span>=</span> <span>{</span> <span>'</span><span>default</span><span>'</span><span>:</span> <span>{</span> <span>'</span><span>ENGINE</span><span>'</span><span>:</span> <span>'</span><span>django.db.backends.sqlite3</span><span>'</span><span>,</span> <span>'</span><span>NAME</span><span>'</span><span>:</span> <span>BASE_DIR</span> <span>/</span> <span>'</span><span>db.sqlite3</span><span>'</span><span>,</span> <span>}</span> <span>}</span> <span>...</span># File: config/settings.py (partial content) ... DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } ...
Enter fullscreen mode Exit fullscreen mode
Define a new model Books
in sample
application. The below changes should be added to sample/models.py
:
<span># File: sample/models.py </span><span>from</span> <span>django.db</span> <span>import</span> <span>models</span><span>class</span> <span>Book</span><span>(</span><span>models</span><span>.</span><span>Model</span><span>):</span> <span># <- NEW </span> <span>title</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>100</span><span>)</span> <span># <- NEW </span> <span>author</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>100</span><span>)</span> <span># <- NEW </span> <span>publication_date</span> <span>=</span> <span>models</span><span>.</span><span>DateField</span><span>()</span> <span># <- NEW </span><span># File: sample/models.py </span> <span>from</span> <span>django.db</span> <span>import</span> <span>models</span> <span>class</span> <span>Book</span><span>(</span><span>models</span><span>.</span><span>Model</span><span>):</span> <span># <- NEW </span> <span>title</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>100</span><span>)</span> <span># <- NEW </span> <span>author</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>100</span><span>)</span> <span># <- NEW </span> <span>publication_date</span> <span>=</span> <span>models</span><span>.</span><span>DateField</span><span>()</span> <span># <- NEW </span># File: sample/models.py from django.db import models class Book(models.Model): # <- NEW title = models.CharField(max_length=100) # <- NEW author = models.CharField(max_length=100) # <- NEW publication_date = models.DateField() # <- NEW
Enter fullscreen mode Exit fullscreen mode
Update Project Configuration to use the new model – The sample
application must be added in the project configuration to INSTALLED_APPS
section.
<span># File: config/settings.py (partial content) </span><span>...</span><span>INSTALLED_APPS</span> <span>=</span> <span>[</span><span>'</span><span>django.contrib.admin</span><span>'</span><span>,</span><span>'</span><span>django.contrib.auth</span><span>'</span><span>,</span><span>'</span><span>django.contrib.contenttypes</span><span>'</span><span>,</span><span>'</span><span>django.contrib.sessions</span><span>'</span><span>,</span><span>'</span><span>django.contrib.messages</span><span>'</span><span>,</span><span>'</span><span>django.contrib.staticfiles</span><span>'</span><span>,</span><span>'</span><span>sample</span><span>'</span> <span># <- NEW </span><span>]</span><span>...</span><span># File: config/settings.py (partial content) </span><span>...</span> <span>INSTALLED_APPS</span> <span>=</span> <span>[</span> <span>'</span><span>django.contrib.admin</span><span>'</span><span>,</span> <span>'</span><span>django.contrib.auth</span><span>'</span><span>,</span> <span>'</span><span>django.contrib.contenttypes</span><span>'</span><span>,</span> <span>'</span><span>django.contrib.sessions</span><span>'</span><span>,</span> <span>'</span><span>django.contrib.messages</span><span>'</span><span>,</span> <span>'</span><span>django.contrib.staticfiles</span><span>'</span><span>,</span> <span>'</span><span>sample</span><span>'</span> <span># <- NEW </span><span>]</span> <span>...</span># File: config/settings.py (partial content) ... INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'sample' # <- NEW ] ...
Enter fullscreen mode Exit fullscreen mode
Tip – for a quick check over latest changes we can run check
subcommand.
<span>$ </span>python manage.py checkSystem check identified no issues <span>(</span>0 silenced<span>)</span><span>.</span><span>$ </span>python manage.py check System check identified no issues <span>(</span>0 silenced<span>)</span><span>.</span>$ python manage.py check System check identified no issues (0 silenced).
Enter fullscreen mode Exit fullscreen mode
Generate the SQL code
<span>$ </span>python manage.py makemigrations <span># generate the SQL code</span>Migrations <span>for</span> <span>'sample'</span>:sample<span>\m</span>igrations<span>\0</span>001_initial.py- Create model Book<span>$ </span>python manage.py makemigrations <span># generate the SQL code</span> Migrations <span>for</span> <span>'sample'</span>: sample<span>\m</span>igrations<span>\0</span>001_initial.py - Create model Book$ python manage.py makemigrations # generate the SQL code Migrations for 'sample': sample\migrations\0001_initial.py - Create model Book
Enter fullscreen mode Exit fullscreen mode
Apply changes on database
<span>$ </span>python manage.py migrateOperations to perform:Apply all migrations: admin, auth, contenttypes, sample, sessionsRunning migrations:Applying sample.0001_initial... OK<span>$ </span>python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sample, sessions Running migrations: Applying sample.0001_initial... OK$ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sample, sessions Running migrations: Applying sample.0001_initial... OK
Enter fullscreen mode Exit fullscreen mode
Use the model via CLI
Once the model is created we can use it via the Django shell
<span>$ </span>python manage.py shell<span>>>></span><span>>>></span> from sample.models import Book <span># import the Book model in our context</span><span>>>></span> from django.utils import timezone <span># used to provide the value for publication_date</span><span>>>></span><span>>>></span> book1 <span>=</span> Book<span>(</span><span>title</span><span>=</span><span>'The Adventures of Tom Sawyer'</span>, <span>author</span><span>=</span><span>'Mark Twain'</span>, <span>publication_date</span><span>=</span>timezone.now<span>()</span> <span>)</span><span>>>></span> book1.save<span>()</span> <span># save the new book</span><span>$ </span>python manage.py shell <span>>>></span> <span>>>></span> from sample.models import Book <span># import the Book model in our context</span> <span>>>></span> from django.utils import timezone <span># used to provide the value for publication_date</span> <span>>>></span> <span>>>></span> book1 <span>=</span> Book<span>(</span><span>title</span><span>=</span><span>'The Adventures of Tom Sawyer'</span>, <span>author</span><span>=</span><span>'Mark Twain'</span>, <span>publication_date</span><span>=</span>timezone.now<span>()</span> <span>)</span> <span>>>></span> book1.save<span>()</span> <span># save the new book</span>$ python manage.py shell >>> >>> from sample.models import Book # import the Book model in our context >>> from django.utils import timezone # used to provide the value for publication_date >>> >>> book1 = Book(title='The Adventures of Tom Sawyer', author='Mark Twain', publication_date=timezone.now() ) >>> book1.save() # save the new book
Enter fullscreen mode Exit fullscreen mode
List all books (using the CLI)
<span>$ </span>python manage.py shell<span>>>></span><span>>>></span> from sample.models import Book<span>>>></span> Book.objects.all<span>()</span><QuerySet <span>[</span><Book: Book object <span>(</span>1<span>)>]></span><span>$ </span>python manage.py shell <span>>>></span> <span>>>></span> from sample.models import Book <span>>>></span> Book.objects.all<span>()</span> <QuerySet <span>[</span><Book: Book object <span>(</span>1<span>)>]></span>$ python manage.py shell >>> >>> from sample.models import Book >>> Book.objects.all() <QuerySet [<Book: Book object (1)>]>
Enter fullscreen mode Exit fullscreen mode
We can see our new book retuned by the query. Let’s improve the information that describe the object.
Django Model – add text representation of an object
To achieve this goal, we should define the __str__()
method for the Book
model
<span># File: sample/models.py </span><span>from</span> <span>django.db</span> <span>import</span> <span>models</span><span>class</span> <span>Book</span><span>(</span><span>models</span><span>.</span><span>Model</span><span>):</span><span>title</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>100</span><span>)</span><span>author</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>100</span><span>)</span><span>publication_date</span> <span>=</span> <span>models</span><span>.</span><span>DateField</span><span>()</span><span>def</span> <span>__str__</span><span>(</span><span>self</span><span>):</span> <span># <- NEW </span> <span>return</span> <span>self</span><span>.</span><span>title</span> <span># <- NEW </span><span># File: sample/models.py </span> <span>from</span> <span>django.db</span> <span>import</span> <span>models</span> <span>class</span> <span>Book</span><span>(</span><span>models</span><span>.</span><span>Model</span><span>):</span> <span>title</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>100</span><span>)</span> <span>author</span> <span>=</span> <span>models</span><span>.</span><span>CharField</span><span>(</span><span>max_length</span><span>=</span><span>100</span><span>)</span> <span>publication_date</span> <span>=</span> <span>models</span><span>.</span><span>DateField</span><span>()</span> <span>def</span> <span>__str__</span><span>(</span><span>self</span><span>):</span> <span># <- NEW </span> <span>return</span> <span>self</span><span>.</span><span>title</span> <span># <- NEW </span># File: sample/models.py from django.db import models class Book(models.Model): title = models.CharField(max_length=100) author = models.CharField(max_length=100) publication_date = models.DateField() def __str__(self): # <- NEW return self.title # <- NEW
Enter fullscreen mode Exit fullscreen mode
Let’s restart the Django console and check the results:
<span>$</span> <span>python</span> <span>manage</span><span>.</span><span>py</span> <span>shell</span><span>>>></span><span>>>></span> <span>from</span> <span>sample.models</span> <span>import</span> <span>Book</span><span>>>></span> <span>Book</span><span>.</span><span>objects</span><span>.</span><span>all</span><span>()</span><span><</span><span>QuerySet</span> <span>[</span><span><</span><span>Book</span><span>:</span> <span>The</span> <span>Adventures</span> <span>of</span> <span>Tom</span> <span>Sawyer</span><span>></span><span>]</span><span>></span><span>$</span> <span>python</span> <span>manage</span><span>.</span><span>py</span> <span>shell</span> <span>>>></span> <span>>>></span> <span>from</span> <span>sample.models</span> <span>import</span> <span>Book</span> <span>>>></span> <span>Book</span><span>.</span><span>objects</span><span>.</span><span>all</span><span>()</span> <span><</span><span>QuerySet</span> <span>[</span><span><</span><span>Book</span><span>:</span> <span>The</span> <span>Adventures</span> <span>of</span> <span>Tom</span> <span>Sawyer</span><span>></span><span>]</span><span>></span>$ python manage.py shell >>> >>> from sample.models import Book >>> Book.objects.all() <QuerySet [<Book: The Adventures of Tom Sawyer>]>
Enter fullscreen mode Exit fullscreen mode
Use the model via Admin Section
Django comes with an admin
section our-of-the box that allows us to manage with ease all models defined in project.
To manage the Book
model in the administration console we need to create a superuser
(aka the admin) and after register
the Book
model to be visible in the admin section.
Create the superuser
<span>$ </span>python manage.py createsuperusersername <span>(</span>leave blank to use <span>'sm0ke'</span><span>)</span>: adminEmail address: admin@appseed.usPassword:Password <span>(</span>again<span>)</span>:Superuser created successfully.<span>$ </span>python manage.py createsuperuser sername <span>(</span>leave blank to use <span>'sm0ke'</span><span>)</span>: admin Email address: admin@appseed.us Password: Password <span>(</span>again<span>)</span>: Superuser created successfully.$ python manage.py createsuperuser sername (leave blank to use 'sm0ke'): admin Email address: admin@appseed.us Password: Password (again): Superuser created successfully.
Enter fullscreen mode Exit fullscreen mode
Register
Book
model to be visible in theadmin
section – Editsample/admin.py
as below:
<span># File: sample/admin.py </span><span>from</span> <span>django.contrib</span> <span>import</span> <span>admin</span><span>from</span> <span>.models</span> <span>import</span> <span>Book</span> <span># <- NEW </span><span>admin</span><span>.</span><span>site</span><span>.</span><span>register</span><span>(</span><span>Book</span><span>)</span> <span># <- NEW </span><span># File: sample/admin.py </span> <span>from</span> <span>django.contrib</span> <span>import</span> <span>admin</span> <span>from</span> <span>.models</span> <span>import</span> <span>Book</span> <span># <- NEW </span> <span>admin</span><span>.</span><span>site</span><span>.</span><span>register</span><span>(</span><span>Book</span><span>)</span> <span># <- NEW </span># File: sample/admin.py from django.contrib import admin from .models import Book # <- NEW admin.site.register(Book) # <- NEW
Enter fullscreen mode Exit fullscreen mode
Authenticate as admin –
http://localhost:8000/admin/
At this point we should see the Books
model in the UI and able to execute CRUD operations.
Create Django Model – List Model Items
Django Create Model – Edit Records
Thanks for reading! Feel free to AMA in the comments section.
More Django Resources
- Read more about Django (official docs)
- Start fast a new project using development-ready Django Starters
暂无评论内容