En este tema, aprenderemos cómo definir modelos en Flask utilizando Flask-SQLAlchemy. Los modelos son una representación de las tablas de la base de datos en forma de clases de Python. Cada clase representa una tabla y cada atributo de la clase representa una columna en la tabla.

Conceptos Clave

  1. Modelos: Clases que representan tablas en la base de datos.
  2. Columnas: Atributos de la clase que representan columnas en la tabla.
  3. Tipos de Datos: Especifican el tipo de datos que cada columna puede almacenar.
  4. Relaciones: Definen cómo los modelos se relacionan entre sí.

Configuración Inicial

Antes de definir modelos, asegúrate de tener Flask-SQLAlchemy instalado y configurado en tu proyecto. Si no lo has hecho, sigue estos pasos:

  1. Instalación:

    pip install flask-sqlalchemy
    
  2. Configuración:

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
    db = SQLAlchemy(app)
    

Definiendo un Modelo Básico

Vamos a definir un modelo básico para una tabla User que tiene las columnas id, username, y email.

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return f'<User {self.username}>'

Explicación del Código

  • db.Model: Todas las clases de modelo deben heredar de db.Model.
  • db.Column: Define una columna en la tabla.
    • db.Integer: Tipo de dato entero.
    • primary_key=True: Define la columna como clave primaria.
    • db.String(80): Tipo de dato cadena con un máximo de 80 caracteres.
    • unique=True: Asegura que los valores en esta columna sean únicos.
    • nullable=False: Asegura que la columna no pueda ser nula.
  • __repr__: Método especial que define cómo se representa el objeto cuando se imprime.

Tipos de Datos Comunes

Tipo de Dato Descripción
db.Integer Entero
db.String(size) Cadena de texto con longitud máxima size
db.Text Cadena de texto sin longitud máxima
db.Float Número de punto flotante
db.Boolean Valor booleano (True o False)
db.DateTime Fecha y hora
db.Date Fecha
db.Time Hora
db.LargeBinary Datos binarios grandes

Relaciones entre Modelos

Las relaciones permiten definir cómo los modelos se relacionan entre sí. Flask-SQLAlchemy soporta varios tipos de relaciones, como One-to-Many, Many-to-One, y Many-to-Many.

Ejemplo de Relación One-to-Many

Vamos a definir una relación One-to-Many entre User y Post. Un usuario puede tener múltiples publicaciones.

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(120), nullable=False)
    content = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    user = db.relationship('User', back_populates='posts')

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    posts = db.relationship('Post', back_populates='user')

    def __repr__(self):
        return f'<User {self.username}>'

Explicación del Código

  • db.ForeignKey('user.id'): Define una clave foránea que referencia la columna id de la tabla user.
  • db.relationship('User', back_populates='posts'): Define la relación en el modelo Post.
  • back_populates='posts': Define la relación inversa en el modelo User.

Creación de la Base de Datos

Para crear las tablas en la base de datos, utiliza el siguiente comando:

db.create_all()

Este comando crea todas las tablas definidas en los modelos.

Ejercicio Práctico

Ejercicio

Define un modelo Comment que tenga las siguientes columnas:

  • id: Entero, clave primaria.
  • content: Texto, no nulo.
  • post_id: Entero, clave foránea que referencia la columna id de la tabla Post.

Solución

class Comment(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.Text, nullable=False)
    post_id = db.Column(db.Integer, db.ForeignKey('post.id'), nullable=False)

    post = db.relationship('Post', back_populates='comments')

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(120), nullable=False)
    content = db.Column(db.Text, nullable=False)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    comments = db.relationship('Comment', back_populates='post')

    user = db.relationship('User', back_populates='posts')

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    posts = db.relationship('Post', back_populates='user')

    def __repr__(self):
        return f'<User {self.username}>'

Explicación

  • Comment: Define el modelo Comment con una relación Many-to-One con Post.
  • post_id: Clave foránea que referencia la columna id de la tabla Post.
  • db.relationship('Post', back_populates='comments'): Define la relación en el modelo Comment.
  • comments = db.relationship('Comment', back_populates='post'): Define la relación inversa en el modelo Post.

Conclusión

En esta sección, hemos aprendido cómo definir modelos en Flask utilizando Flask-SQLAlchemy. Hemos cubierto los conceptos básicos de los modelos, tipos de datos comunes y cómo definir relaciones entre modelos. En la siguiente sección, exploraremos cómo realizar operaciones CRUD utilizando estos modelos.

¡Continúa practicando y experimentando con diferentes tipos de modelos y relaciones para fortalecer tu comprensión!

Curso de Desarrollo Web con Flask

Módulo 1: Introducción a Flask

Módulo 2: Conceptos Básicos de Flask

Módulo 3: Formularios y Entrada de Usuario

Módulo 4: Integración de Bases de Datos

Módulo 5: Autenticación de Usuarios

Módulo 6: Conceptos Avanzados de Flask

Módulo 7: APIs RESTful con Flask

Módulo 8: Despliegue y Producción

Módulo 9: Pruebas y Mejores Prácticas

Módulo 10: Extensiones y Ecosistema de Flask

© Copyright 2024. Todos los derechos reservados