Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
17 views

How to use PostgreSQL with Django _ EDB

Uploaded by

sakshi.arora.in1
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
17 views

How to use PostgreSQL with Django _ EDB

Uploaded by

sakshi.arora.in1
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 13

7/7/2020 How to use PostgreSQL with Django | EDB

Postgres Tutorials
Back

How to use PostgreSQL with Django


Developer Tools Python Django

Richard Yen, Principal Support Engineer . Dec 30, 2019

This article covers how to use PostgreSQL together with the Python web application framework
Django. After walking through the Django installation process it shows how to get started
creating a simple Django application.

1. Getting started

2. Creating a virtual environment

3. Installing Django

4. Building a simple app in Django with PostgreSQL

In the early days of web development, the framework of choice was LAMP, or
Linux+Apache+MySQL+PHP. While PHP is still a great language for coding, Python has picked up a lot
of popularity. With its clean syntax and use in a variety of industries, Python becomes a natural choice
for any budding coder. In this article, we’ll show you how to get Postgres connected with Django, a
popular web application framework for Python.

Getting started
When working with Python, it’s highly recommended to use a virtual environment. This prevents
dependency collisions and undesired behaviors that would otherwise arise from premature or
unintended version changes. As such, we highly encourage you to use “virtualenv,” along with Python

https://www.enterprisedb.com/postgres-tutorials/how-use-postgresql-django 1/13
7/7/2020 How to use PostgreSQL with Django | EDB

v. 3.x. Obtaining and installing Python v. 3.x is a task outside the scope of this article, but there are
many resources out there that provide instructions on how to do this.

We will also assume that you’ve got a Postgres instance up and running somewhere. If you need help
with that, we’ve got articles that you can refer to.

Creating a virtual environment


The first step to getting started with Django is to create the virtual environment. If you don’t already
have “virtualenv” installed, then simply install with “pip”:

sudo pip install virtualenv

We’ll create a project folder called “myproject” in the “/var” directory:

mkdir /var/myproject

cd /var/myproject

Then, you will need to use “virtualenv” to create a place for the environment-specific dependencies to
be installed:

[root@pga /]# virtualenv /var/myproject/myprojectenv

Using base prefix '/opt/rh/rh-python36/root/usr'

New python executable in /var/myproject/myprojectenv/bin/python3

Also creating executable in /var/myproject/myprojectenv/bin/python

Installing setuptools, pip, wheel...done.

[root@pga /]# ls /var/myproject/myprojectenv/

bin include lib lib64

Then, activate the environment:

[root@pga /]# python --version

Python 2.7.5

[root@pga /]# source /var/myproject/myprojectenv/bin/activate

(myprojectenv) [root@pga /]# python --version

Python 3.6.3

To get Python working with Postgres, you will need to install the “psycopg2” module. However, you
must first have pg_config installed on your OS:

https://www.enterprisedb.com/postgres-tutorials/how-use-postgresql-django 2/13
7/7/2020 How to use PostgreSQL with Django | EDB

[root@pga /]# pg_config

bash: pg_config: command not found

[root@pga /]# export PATH=/usr/pgsql-12/bin/:${PATH}

[root@pga /]# which pg_config

/usr/pgsql-12/bin/pg_config

If you can’t find pg_config on your OS, you will need to install a Postgres client first. After you ensure
pg_config is available on your system, go ahead and install “psycopg2”:

# pip install psycopg2

Installing Django
Once we’ve activated the virtual environment, we can install Django into that environment, so as to
keep things in your project from interfering with the host OS:

# pip install django

Once Django has been installed, you can start a new Django project:

(myprojectenv) [root@pga bin]# pwd

/var/myproject/myprojectenv/bin

(myprojectenv) [root@pga bin]# django-admin.py startproject myproject .

By default, Django is configured to use SQLite as its backend. To use Postgres instead,
“myproject/settings.py” needs to be updated:

# cat myproject/settings.py

. . .

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.postgresql_psycopg2',

'NAME': ‘<db_name>’,

'USER': '<db_username>',

'PASSWORD': '<password>',

'HOST': '<db_hostname_or_ip>',

'PORT': '<db_port>',

. . .

https://www.enterprisedb.com/postgres-tutorials/how-use-postgresql-django 3/13
7/7/2020 How to use PostgreSQL with Django | EDB

Once you’ve got things pointed to the Postgres database, you can build the default schema. If you
didn’t know already, Django was designed with user access in mind, so by default a Django application
will create a database schema involving users, groups, and permissions. To create the schema,
generate a migration and run it:

(myprojectenv) [root@pga bin]# python manage.py makemigrations

No changes detected

(myprojectenv) [root@pga bin]# python manage.py migrate

Operations to perform:

Apply all migrations: admin, auth, contenttypes, sessions

Running migrations:

Applying contenttypes.0001_initial... OK

Applying auth.0001_initial... OK

Applying admin.0001_initial... OK

Applying admin.0002_logentry_remove_auto_add... OK

Applying admin.0003_logentry_add_action_flag_choices... OK

Applying contenttypes.0002_remove_content_type_name... OK

Applying auth.0002_alter_permission_name_max_length... OK

Applying auth.0003_alter_user_email_max_length... OK

Applying auth.0004_alter_user_username_opts... OK

Applying auth.0005_alter_user_last_login_null... OK

Applying auth.0006_require_contenttypes_0002... OK

Applying auth.0007_alter_validators_add_error_messages... OK

Applying auth.0008_alter_user_username_max_length... OK

Applying auth.0009_alter_user_last_name_max_length... OK

Applying auth.0010_alter_group_name_max_length... OK

Applying auth.0011_update_proxy_permissions... OK

Applying sessions.0001_initial... OK

(myprojectenv) [root@pga bin]#

After creating the default schema, create the default superuser:

(myprojectenv) [root@pga bin]# python manage.py createsuperuser

Username (leave blank to use 'root'): richyen

Email address: support@enterprisedb.com

Password:

Password (again):

Superuser created successfully.

(myprojectenv) [root@pga bin]#

https://www.enterprisedb.com/postgres-tutorials/how-use-postgresql-django 4/13
7/7/2020 How to use PostgreSQL with Django | EDB

Now, the moment of truth! Start the application up, and point your browser to the corresponding port:

(myprojectenv) [root@pga bin]# python manage.py runserver 0.0.0.0:5000

Watching for file changes with StatReloader

Performing system checks...

System check identified no issues (0 silenced).

December 06, 2019 - 07:06:22

Django version 3.0, using settings 'myproject.settings'

Starting development server at http://0.0.0.0:5000/

Quit the server with CONTROL-C.

Hooray! We’re in business!

To verify that your superuser works, go to the “/admin” page:

Enter the password, and we’re in!

https://www.enterprisedb.com/postgres-tutorials/how-use-postgresql-django 5/13
7/7/2020 How to use PostgreSQL with Django | EDB

Building a simple app in Django with PostgreSQL


At this point, we’ve got a Postgres database running with Django. Now, how can we build out Django
further, and leverage the ORM to do the heavy lifting of interacting with the database?

Let’s make the app display a relationship between cars and their owners:

(myprojectenv) [root@pga bin]# python manage.py startapp cars

This creates a folder called “cars”, which consists of the following important files:

(myprojectenv) [root@pga bin]# cd cars/

(myprojectenv) [root@pga cars]# ls -l

total 24

-rw-r--r-- 1 root root 63 Dec 6 07:29 admin.py

-rw-r--r-- 1 root root 94 Dec 6 07:29 apps.py

-rw-r--r-- 1 root root 0 Dec 6 07:29 __init__.py

drwxr-xr-x 2 root root 4096 Dec 6 07:29 migrations

-rw-r--r-- 1 root root 57 Dec 6 07:29 models.py

-rw-r--r-- 1 root root 60 Dec 6 07:29 tests.py

-rw-r--r-- 1 root root 63 Dec 6 07:29 views.py

Let’s tell the framework what a Car and a Driver look like, by defining them in “models.py”:

https://www.enterprisedb.com/postgres-tutorials/how-use-postgresql-django 6/13
7/7/2020 How to use PostgreSQL with Django | EDB

(myprojectenv) [root@pga bin]# cat cars/models.py

from django.db import models

class Driver(models.Model):

name = models.TextField()

license = models.TextField()

class Car(models.Model):

make = models.TextField()

model = models.TextField()

year = models.IntegerField()

vin = models.TextField()

owner = models.ForeignKey("Driver", on_delete=models.SET_NULL, null=True)

Then, make the migration to build the tables in the database, and run it:

(myprojectenv) [root@pga bin]# python manage.py makemigrations cars

Migrations for 'cars':

cars/migrations/0001_initial.py

- Create model Driver

- Create model Car

(myprojectenv) [root@pga bin]# python manage.py migrate cars

Operations to perform:

Apply all migrations: cars

Running migrations:

Applying cars.0001_initial... OK

Take a look in the database, and you’ll see that the table has been created with the format
“<project_name>_<object_name>”:

https://www.enterprisedb.com/postgres-tutorials/how-use-postgresql-django 7/13
7/7/2020 How to use PostgreSQL with Django | EDB

postgres=# \d

List of relations

Schema | Name | Type | Owner

--------+-----------------------------+----------+----------

public | auth_group | table | postgres

public | auth_group_id_seq | sequence | postgres

<...>

public | cars_car | table | postgres

public | cars_car_id_seq | sequence | postgres

public | cars_driver | table | postgres

public | cars_driver_id_seq | sequence | postgres

I also created some random data for the purposes of this tutorial:

postgres=# select * from cars_driver;

id | name | license

----+----------+----------

1 | John Doe | Z1234567

2 | Jane Doe | Z9876543

(2 rows)

postgres=# select * from cars_car;

id | make | model | year | vin | owner_id

----+--------+--------+------+----------------------------------+----------

1 | Ford | F-150 | 2004 | 01083da2df15d6ebfe62186418a76863 | 1

2 | Toyota | Sienna | 2014 | 53092a17afa460689ca931f0d459e399 | 1

3 | Honda | Civic | 2018 | 844c56840b5fc26d414cf238381a5f1a | 2

4 | GMC | Sierra | 2012 | 29aeffa4d5aa21d25d7196db3728f72c | 2

(4 rows)

We need to tell Django how to pull stuff out of the database and display it. By editing the
“cars/views.py” file, we can accomplish this:

https://www.enterprisedb.com/postgres-tutorials/how-use-postgresql-django 8/13
7/7/2020 How to use PostgreSQL with Django | EDB

(myprojectenv) [root@pga cars]# cat views.py

from django.shortcuts import render

from cars.models import Car, Driver

def car_detail(request, pk):

owner_obj = Driver.objects.get(pk=pk)

car_objs = Car.objects.filter(owner_id=owner_obj.id)

context = {

"vehicles": car_objs,

"drivers": owner_obj,

return render(request, "car_detail.html", context)

We also need to define a template so that the “views.py” procedures have a place to send the data.
First, we create a “cars/template/base.html” file that contains the more generic elements of an HTML
page:

(myprojectenv) [root@pga cars]# cat templates/base.html

<!doctype html>

<html>

<head>

<meta charset="utf-8">

<meta name="viewport" content="width=device-width, initial-scale=1">

<title>Contacts</title>

<link rel="stylesheet"
href="https://unpkg.com/tachyons@4.10.0/css/tachyons.min.css"/>

</head>

<body>

{% block page_content %}{% endblock %}

</body>

</html>

Then, we define how the “car_detail.html” template will look:

https://www.enterprisedb.com/postgres-tutorials/how-use-postgresql-django 9/13
7/7/2020 How to use PostgreSQL with Django | EDB

(myprojectenv) [root@pga cars]# cat templates/car_detail.html

{% extends "base.html" %}

{% block page_content %}

<div class="mw6 center pa3 sans-serif">

<h1 class="mb4">Driver: {{ drivers.name | linebreaks }}</h1>

<header class="b mb2">License: {{ drivers.license }}</header>

{% for v in vehicles %}

<div class="pa2 mb3 striped--near-white">

<div class="pl2">

<p class="mb2">Make/Model: {{ v.make }} {{ v.model }}</p>

<p class="mb2">Year: {{ v.year }}</p>

<p class="mb2">Vin: {{ v.vin }}</p>

</div>

</div>

{% endfor %}

</div>

{% endblock %}

Finally, we need to tell the webserver how to route the traffic. First, in “cars/urls.py”, we define how
the REST behavior works:

(myprojectenv) [root@pga cars]# cat urls.py

from django.urls import path

from . import views

urlpatterns = [

path("<int:pk>/", views.car_detail, name="car_detail"),

Note that this will allow us to retrieve Car and Driver objects based on the ID provided in the URL.

Then, in “myproject/urls.py,” we define the root URL for the “cars” application:

https://www.enterprisedb.com/postgres-tutorials/how-use-postgresql-django 10/13
7/7/2020 How to use PostgreSQL with Django | EDB

from django.contrib import admin

from django.urls import path, include

urlpatterns = [

path('admin/', admin.site.urls),

path("cars/", include("cars.urls")),

Tell Django that the “cars” app is active by adding “cars” to the “INSTALLED_APPS” list in
“myproject/settings.py”:

Spin up the webserver:

(myprojectenv) [root@pga bin]# python manage.py runserver 0.0.0.0:5000

Watching for file changes with StatReloader

Performing system checks...

System check identified no issues (0 silenced).

December 09, 2019 - 23:53:09

Django version 3.0, using settings 'myproject.settings'

Starting development server at http://0.0.0.0:5000/

Quit the server with CONTROL-C.

And visit http://127.0.0.1:5000/cars/1/:

Change the “1” to a “2” in the URL, and we will get the Driver with `id=2` and the Cars owned by that
Driver:

https://www.enterprisedb.com/postgres-tutorials/how-use-postgresql-django 11/13
7/7/2020 How to use PostgreSQL with Django | EDB

This is a very simple example of how Django can be used to serve up web pages with data from
PostgreSQL. More information about how to define relationships between Django and PostgreSQL
(many-to-many relationships, complex joins, complex filtering, etc.) can be found at the Django
documentation.

Richard Yen, Principal Support Engineer

Ready to take the next step with PostgreSQL? Contact Us

Why EDB?

Use Cases
Oracle Migration

Hybrid Cloud

High Availability

Solutions for
IT Professionals

Database Architects

Developers

Database Admins

Products

Databases
EDB Postgres Advanced Server

PostgreSQL

Cloud Database Service

Tools
Postgres Enterprise Manager

Backup and Recovery Tool

Failover Manager

Open Source Projects

Migration Portal

Migration Toolkit
https://www.enterprisedb.com/postgres-tutorials/how-use-postgresql-django 12/13
7/7/2020 How to use PostgreSQL with Django | EDB
Migration Toolkit

Replication Server

Services
Services Overview

Getting Started

Postgres Optimization

Enterprise Strategy

Custom Services

Support
Customer Support Portal

Support Overview

PostgreSQL Technical Support

Remote DBA Service

Cloud DBA Service

Technical Account Management

Resources
Downloads

Blog

Webinars

PostgreSQL Tutorials

Training

Partners

White Papers

Case Studies

Docs

Plans

Company
About EDB

PostgreSQL Contributions

Careers

Events

Press Releases

Media Coverage

Customers

Follow Us
Twitter

LinkedIn

YouTube

© 2020 EDB . GDPR . Privacy Policy . Terms of Use . Trademarks

https://www.enterprisedb.com/postgres-tutorials/how-use-postgresql-django 13/13

You might also like