¿Cómo se agrega un nuevo campo a una tabla en Django?
Para agregar un nuevo campo a una tabla existente, necesitas modificar la clase del modelo correspondiente. Por ejemplo, si deseas añadir el campo "año" a la clase Carro, lo haces así:
Añade el campo como un TextField con un MaxLength de 4, ya que solo necesitas almacenar valores como 2022, 2023, etc.
classCarro(models.Model):... año = models.TextField(max_length=4, null=True)
¿Qué pasos se siguen después de modificar el modelo?
Después de agregar el nuevo campo al modelo, sigue estos pasos:
Guardar los cambios en el archivo del modelo: No olvides guardar el archivo después de realizar modificaciones.
Crear nuevas migraciones: Ejecuta el comando python manage.py makemigrations. Si no detecta cambios, verifica si guardaste el archivo.
Aplicar las migraciones: Ejecuta python manage.py migrate. Este comando actualiza la base de datos con la nueva estructura.
¿Cómo se soluciona el error de campo no nulo?
Si intentas crear un campo no nulo en una tabla que ya contiene datos, Django te pedirá resolver cómo manejar los registros existentes. Puedes:
Proveer un valor por defecto.
Permitir valores nulos.
En este ejemplo, se permite que el campo "año" sea nulo (null=True), para evitar problemas con registros anteriores.
¿Cómo se utiliza el ORM de Django para interactuar con los datos?
Una vez aplicado el nuevo campo, puedes usar el ORM de Django para interactuar con la base de datos. Usamos el comando python manage.py shell para acceder al shell interactivo de Django.
Ejemplo de cómo crear un nuevo registro:
Importar el modelo:
from my_first_app.models import Carro
Crear una instancia de Carro:
nuevo_carro = Carro(titulo='BMW', año='2023')
Guardar la instancia en la base de datos:
nuevo_carro.save()
¿Cómo mejorar la visualización de los objetos en el shell?
Define el método __str__ en tu modelo para que la representación textual del objeto sea más clara:
En Ruby on Rails el flujo es crear las migraciones y luego en base a ellas se modifican las tablas. (Los modelos de primeras no tienen una descripción de qué atributos tienen). Algo similar pasa en Laravel.
Aquí con Django, modificas los modelos y en base a estas modificaciones se crean las migraciones.
Es decir:
Django: Modelos primero, migraciones después.
Rails: Migraciones primero, modelos después.
Pero de manera transversal, en ambos se puede hacer el mismo flujo...
Me parece cool cuando comparas Django con otras herramientas, siempre es útil poder ver las diferencias y así poder elegir la mejor herramienta a tu gusto o necesidad!
Les recomiendo que cuando hagan los comandos haganlos en un script de python y luego los copian en la python shell para probrar, o directamente lo ejecutan como script de python es lo mismo.
Cuando ejecutas makemigrations, Django crea un nuevo archivo de migración para cada cambio que realizas en el modelo, en este caso 0001_initial.py representa la creación inicial de la tabla. Cuando decidiste agregar el campo year, Django genera 0002_car_year.py porque estás haciendo un cambio estructural en el modelo existente. Cada archivo de migración es independiente y refleja el estado del modelo en diferentes momentos, permitiendo así un control de cambios y una gestión eficiente de la base de datos.
📚 Nombre de la clase
Inserción de datos en SQLite con Django
🎯 Idea principal
Django permite insertar y gestionar datos en la base de datos utilizando el ORM, lo que evita escribir consultas SQL directamente. A través de los modelos se pueden crear registros que se almacenan automáticamente en la base de datos, en este caso SQLite, que es la base de datos que Django usa por defecto para desarrollo.
⚡ Síntesis en 10 segundos
Django usa SQLite por defecto en desarrollo.
Los datos se insertan a través de Model.
El ORM traduce operaciones de Python a SQL.
Crear un objeto del modelo genera un registro en la base de datos.
Permite manipular datos sin escribir SQL.
🔑 Puntos clave
Inserción de datos
Los datos se agregan creando instancias de los modelos definidos en Django.
Uso del ORM
El ORM permite crear registros en la base de datos usando objetos de Python.
Base de datos SQLite
Django utiliza SQLite por defecto porque es ligera y fácil de usar en desarrollo.
Persistencia de información
Cuando se guarda un objeto del modelo, Django lo convierte en un registro dentro de la base de datos.
Interacción con la base de datos
Los desarrolladores pueden manipular datos utilizando métodos del ORM en lugar de escribir consultas SQL manualmente.
🧠 Conceptos importantes
SQLite
Base de datos ligera basada en archivos que Django utiliza por defecto para proyectos en desarrollo.
Registro (Row)
Cada fila almacenada dentro de una tabla de base de datos.
Instancia de modelo
Objeto creado a partir de un modelo que representa un registro de datos.
ORM (Object Relational Mapping)
Capa que traduce operaciones de Python en consultas de base de datos.
Persistencia
Proceso de almacenar información de manera permanente.
🧩 Modelo mental de la clase
Aplicación necesita guardar información
↓
Se crea una instancia del Model
↓
El ORM traduce la operación a SQL
↓
Se inserta un registro en SQLite
↓
La información queda almacenada en la base de datos
Este flujo muestra cómo Django conecta objetos de Python con datos persistentes.
🚀 Acciones inmediatas
Crear instancias de los modelos definidos en la aplicación.
Guardar esas instancias para insertar datos en la base de datos.
Verificar los registros almacenados en SQLite.
Entender cómo el ORM traduce objetos de Python a datos persistentes.
💼 Aplicación profesional
La inserción de datos es la base de casi cualquier aplicación web, por ejemplo:
registro de usuarios
creación de publicaciones
gestión de productos
almacenamiento de información empresarial
En proyectos reales, el ORM permite manipular datos de forma segura, mantenible y más rápida de desarrollar.
🔥 Errores comunes
Intentar manipular la base de datos directamente sin usar los modelos.
Pensar que los modelos solo describen datos, cuando también permiten crear y guardar registros.
Confundir la base de datos de desarrollo con la de producción.
SQLite suele usarse en desarrollo, mientras que en producción se usan sistemas como PostgreSQL.
📝 Reflexión estratégica
Uno de los mayores beneficios de Django es que permite trabajar con datos usando objetos de Python en lugar de SQL directo.
Esto simplifica el desarrollo y permite concentrarse en la lógica de la aplicación. Entender bien cómo los modelos interactúan con la base de datos es fundamental para construir aplicaciones web robustas y escalables.
Excelente clase, viniendo del curso de flask la verdad es que se me ha hecho mucho mas facil de entender, me alegro de haber comenzado por ahí. Excelente la ruta de python que tiene usted, maestro, saludos!
Usar la shell interactiva con python manage.py shell es como tener un panel de control directo al motor de tu aplicación. A diferencia de la terminal normal de Python, esta herramienta carga automáticamente toda la configuración de tu proyecto, conectándose de inmediato a tu base de datos.
Es la mejor manera de probar tu código, hacer consultas rápidas o insertar datos de prueba sin necesidad de construir vistas, formularios o rutas en el navegador. Si quieres verificar que un modelo funciona correctamente o necesitas corregir un dato específico rápidamente, simplemente abres la shell, importas tu modelo y ejecutas comandos del ORM. Esto acelera drásticamente tu flujo de trabajo, permitiéndote experimentar y depurar en tiempo real con la confianza de que estás interactuando con el entorno real de tu aplicación.
from django.db import models# Create your models here.class Car(models.Model): title = models.TextField(max_length=255) year = models.TextField(max_length=4, null=True) color = models.TextField(max_length=255, default="Gray") def __str__(self): return f"Car {self.title}, model: {self.year} in color {self.color}"
tambien me gusta y veo mas logico la forma de laravel y RoR donde se hace primero la migracion, en .net tambien es como python, se basa la migracion en lo que definamos en cada modelo
gente, si por algun motivo, ustedes se equivocan creando un campo, y le cambiaron el nombre luego de hacer las migraciones, pueden ir al ultimo archivo dentro de migrations y agregar al final esta linea de código
De hecho, vi que al hacer el cambio en el nombre del campo y luego correr el comando de makemigrations, reconoce y me pregunta si realice el cambio de nombre, y al darle que si, crea un migration nuevo con este código que mencionas.
Me está costando horrores pero no me rindo! Agregando más carros con su respectivo color. Probé agregar un valor como default en los otros carros creados anteriormente.
El método mágico .__str__() nos ayudará a mostrar una descripción del objeto y será llamado al momento de hacer uso de la función str(), como sucede en el caso de la función print() que internamente hace uso de esta; sin embargo, se espera que la información mostrada sea resumida para ser mostrada a los usuarios de la aplicación.
classCar(models.Model): title = models.TextField(max_length=250) year = models.TextField(max_length=4, null=True)def__str__(self):returnf"{self.title} - {self.year}"```classCar(models.Model):  title = models.TextField(max\_length=250)  year = models.TextField(max\_length=4, null=True)  def \_\_str\_\_(self):  return f"{self.title} - {self.year}"El método mágico `.__repr__()` mantiene una utilidad similar (siempre y cuando el método mágico `.__str__()` no haya sido definido); sin embargo, se espera que la información representada permita a los programadores, que realizan los mantenimientos a la aplicación, entender mejor cómo se crea dicho objeto.
```python
classCar(models.Model): title = models.TextField(max_length=250) year = models.TextField(max_length=4, null=True)def__repr__(self):returnf"Car(title='{self.title}', year='{self.year}')"```classCar(models.Model):  title = models.TextField(max\_length=250)  year = models.TextField(max\_length=4, null=True)  def \_\_repr\_\_(self):  return f"Car(title='{self.title}', year='{self.year}')"