Crear una API en Django con PostgreSQL y consumirla desde PHP


En esta guía aprenderás paso a paso y desde cero a construir una API REST profesional utilizando Django y PostgreSQL, y a consumirla desde un frontend en PHP, todo sobre Ubuntu 22.04.

Este contenido está pensado para principiantes, estudiantes y desarrolladores que desean comprender cómo se conectan el backend y el frontend en un entorno real.

Instalación de PostgreSQL
Instalación de Django en Ubuntu 22.04
Configuración de Django + PostgreSQL
Creación de API básica con Django REST Framework
Consumo de la API desde PHP (frontend)

Introducción: En este video aprenderás a instalar PostgreSQL, Django y a crear una API básica que luego consumiremos desde PHP, todo desde cero en Ubuntu 22.04.

1. Instalación de PostgreSQL

Actualizar el Sistema Operativo

sudo apt update && sudo apt upgrade -y

Instalar PostgreSQL

sudo apt install postgresql postgresql-contrib -y

Ingresamos desde el terminal

sudo -i -u postgres
psql

Crear base de datos y usuario

CREATE DATABASE apidjango;
CREATE USER usuarioapi WITH PASSWORD '12345';
ALTER ROLE usuarioapi SET client_encoding TO 'utf8';
ALTER ROLE usuarioapi SET default_transaction_isolation TO 'read committed';
ALTER ROLE usuarioapi SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE apidjango TO usuarioapi;
\q
exit

Instalar Python y Django

Instalar dependencias

sudo apt install python3 python3-pip python3-venv -y

Crear entorno virtual y activar entorno

python3 -m venv venv
source venv/bin/activate

Instalar Django, REST Framework, Conexión con PostgreSQL

pip install django djangorestframework psycopg2-binary

Instalar Visual Studio Code

sudo snap install code –classic

Crear Proyecto Django y aplicación

django-admin startproject backend
cd backend
python manage.py startapp personas

Abrir settings.py y añadir el proyecto

INSTALLED_APPS = [
    'rest_framework',
    'personas',
]

Conectar Django con PostgreSQL

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'apidjango',
        'USER': 'usuarioapi',
        'PASSWORD': '12345',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

Migrar los modelos iniciales.

python manage.py migrate

Crear super usuario

python manage.py createsuperuser

Crear Modelo de Datos:  models.py

from django.db import models

# Create your models here.

class Persona(models.Model):
    nombre = models.CharField(max_length=100)
    apellido = models.CharField(max_length=100)
    edad = models.IntegerField()
    email = models.EmailField()

Migraciones:

python manage.py makemigrations
python manage.py migrate

Agregamos al admin de django

from .models import Persona

# Register your models here.

admin.site.register(Persona)

Crear Serializer: serializers.py

El archivo serializers.py sirve para convertir datos del modelo Django en JSON y también para convertir JSON en datos que se guardan en la base de datos.

Es el puente entre:

  • Base de datos (Modelos Django)
  • API REST (JSON)
  • Frontend (PHP, JS, React, etc.)
from rest_framework import serializers
from .models import Persona

class PersonaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Persona
        fields = '__all__'

Crear Vista de la API: views.py

  • Convierte una función normal de Django en una vista de API REST

  • Define qué métodos HTTP acepta (GET, POST, PUT, DELETE)

  • Permite acceder a la base de datos

  • Consultar, crear, editar y eliminar registros

  • Convierte objetos Python en JSON

  • Valida datos que vienen del frontend

from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Persona
from .serializers import PersonaSerializer

# Create your views here.
@api_view(['GET'])
def lista_personas(request):
    personas = Persona.objects.all()
    serializer = PersonaSerializer(personas, many=True)
    return Response(serializer.data)

Configurar URLs: personas/urls.py

from django.urls import path
from .views import lista_personas

urlpatterns = [
   path('personas/', lista_personas),

]

backend/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('personas.urls')),

]

Probar la API

python manage.py runserver

Navegador:

http://127.0.0.1:8000/api/personas/

Instalación del Frontend

Instalar el servidor web apache

sudo apt install apache2 -y

Instalar php

sudo apt install php libapache2-mod-php php-cli -y

Comprobamos en el navegador

http://localhost

Consumir la API desde PHP : index.php

  • $url -> Dirección de la API
  • file_get_contents() -> Consume la API
  • json_decode() -> Convierte JSON a array
<?php
$url = "http://127.0.0.1:8000/api/personas/";
$response = file_get_contents($url);
$data = json_decode($response, true);
?>

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Listado de Personas</title>

    <style>
        body {
            font-family: Arial, Helvetica, sans-serif;
            background-color: #f4f6f8;
            padding: 40px;
        }

        h1 {
            text-align: center;
            color: #2c3e50;
            margin-bottom: 20px;
        }

        table {
            width: 100%;
            max-width: 900px;
            margin: auto;
            border-collapse: collapse;
            background: #ffffff;
            box-shadow: 0 5px 15px rgba(0,0,0,0.1);
        }

        thead {
            background-color: #2d89ef;
            color: #ffffff;
        }

        th, td {
            padding: 12px 15px;
            text-align: center;
            border-bottom: 1px solid #e0e0e0;
        }

        tr:nth-child(even) {
            background-color: #f2f6fc;
        }

        tr:hover {
            background-color: #e8f0fe;
        }

        th {
            text-transform: uppercase;
            font-size: 14px;
            letter-spacing: 0.5px;
        }
    </style>
</head>
<body>

<h1>📋 Listado de Personas</h1>

<table>
    <thead>
        <tr>
            <th>Nombre</th>
            <th>Apellido</th>
            <th>Edad</th>
            <th>Email</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($data as $persona): ?>
        <tr>
            <td><?= htmlspecialchars($persona['nombre']) ?></td>
            <td><?= htmlspecialchars($persona['apellido']) ?></td>
            <td><?= htmlspecialchars($persona['edad']) ?></td>
            <td><?= htmlspecialchars($persona['email']) ?></td>
        </tr>
        <?php endforeach; ?>
    </tbody>
</table>

</body>
</html>

 

Síguenos en nuestras redes sociales