Buenas prácticas para definir modelos con Django, reescrito en español y con recomendaciones prácticas aplicables en proyectos reales de software a medida. En Q2BSTUDIO, empresa de desarrollo de software, aplicaciones a medida, especialistas en inteligencia artificial, ciberseguridad y servicios cloud, hemos consolidado estas pautas para que tu base de datos y tus modelos se mantengan limpios, coherentes y listos para escalar.
Diez no hagas
1 No te apoyes en características del ORM para crear varios modelos con el mismo nombre confiando en que el nombre de tabla y de relaciones lo solucionen. 2 No te precipites a introducir un campo is_deleted con on_delete=PROTECT en todos los modelos ni a sobreescribir métodos del manager como all o filter de forma global. 3 No permitas dualidad en los filtros ni múltiples caminos para obtener el mismo resultado. 4 No ignores la conveniencia de usar la base de datos directamente cuando simplifica y aporta claridad técnica. 5 No sigas a ciegas las best practices de un ORM concreto, sigue las buenas prácticas comunes. 6 No construyas algoritmos acoplados a registros de base de datos. 7 No hagas cambios en la base de datos que no estén reflejados en el código. 8 No temas desnormalizar si te ayuda a mantener la lógica de dominio clara y evitar llegar a CQRS sin necesidad. 9 No edites migraciones salvo en casos excepcionales y muy justificados. 10 No uses características específicas del motor si prevés cambiar de proveedor, despliegues en distintos entornos o pruebas con SQLite en memoria.
Nomenclatura de modelos y tablas
Django permite duplicar nombres de clase en distintas apps creando tablas con prefijo de app, por ejemplo users.Group a users_group y posts.Group a posts_group. Aunque en base de datos funcione, en el código genera confusión y complica mover modelos entre apps. Recomendaciones prácticas: 1 Si puede hacer falta, añade el prefijo lógico de la app en el nombre del modelo, por ejemplo UserGroup y PostGroup. 2 Especifica de forma explícita el nombre de la tabla en Meta en snake case con db_table. 3 Describe los campos ManyToMany en la tabla secundaria y valora una solución bidireccional cuando aplique. 4 Nombra las claves foráneas y M2M de forma semántica, por ejemplo author en lugar de user, reservando nombres técnicos para tablas M2M explícitas. 5 Para relaciones M2M usa el patrón model_name__field_name porque una misma pareja de tablas puede tener varias finalidades. 6 Si utilizas through para la tabla M2M, define en Meta el nombre siguiendo el mismo patrón. 7 Declara siempre default_related_name en Meta en snake case y plural. 8 Cuando no puedas usar el default related name por múltiples FKs o M2M, define related_name con el patrón field_name_model_name_plural. 9 Completa Meta con db_table_comment, verbose_name y verbose_name_plural además de default_related_name. Recuerda que una tabla M2M solo necesita db_table. Un ejemplo clásico es Comment, que aunque conecta User y Post, se modela como entidad lógica independiente por su funcionalidad propia.
Gestión del borrado
Evita el patrón genérico de is_deleted con on_delete=PROTECT. A veces la basura es basura y conviene borrarla. En pruebas necesitarás crear y limpiar datos rápidamente. El campo is_deleted no aporta semántica y on_delete=CASCADE puede eliminar históricos valiosos. Mejor modela la intención: por ejemplo, una Task con subtask con on_delete=SET_NULL y un booleano is_active con default y db_default en false. Consulta lo activo con filtros explícitos sobre is_active.
Campos con default
Si un campo tiene default, define también db_default para alinear el comportamiento de aplicación y base de datos.
Campos booleanos
Pon siempre default y nunca null true. Añade también db_default. Ejemplo conceptual: is_active con default false y db_default false.
Campos de fecha y hora
default=timezone.now cuando quieras pre rellenar al renderizar formularios. auto_now_add true cuando quieras establecer la fecha al crear y no sea editable. auto_now true cuando deba actualizarse en cada edición y no deba ser gestionado manualmente.
CharField y TextField
La documentación de Django sugiere evitar null en campos de texto y preferir cadena vacía. En la práctica, para TextField rara vez es necesario cambiarlo. Para CharField es habitual que sea requerido, que almacene valores fijos mediante TextChoices o que contenga notas sin necesidades de filtrado. Recomendación pragmática: 1 Evita default vacío en CharField y probablemente en TextField, usa null true cuando no sea obligatorio. 2 Si desconoces el límite, max_length 255 es razonable.
Choices y estados
No acoples reglas a registros de base de datos ni sacrifiques claridad por supuestos ahorros. Usa TextChoices en la mayoría de los casos, nombra la clase en plural y pon los valores en mayúsculas para indicar que son constantes de dominio. Define la clase de choices dentro del modelo salvo que se reutilice en otros. Este enfoque es preferible a IntegerChoices en muchas situaciones y muy superior a crear una tabla Status con una clave foránea para estados. Lo mismo aplica a derechos y permisos.
Trabajo directo con la base de datos
Usa consultas claras y expresivas. Evita duplicar rutas de filtrado que generen divergencias. No dejes operaciones manuales fuera del control del código ni dependas de rasgos exclusivos del motor si planeas mover entre proveedores o utilizar servicios cloud como AWS o Azure.
Por qué importa para tu negocio
Unos modelos bien definidos reducen deuda técnica, aceleran la entrega de aplicaciones a medida, simplifican la analítica con servicios inteligencia de negocio y facilitan la integración de inteligencia artificial e incluso agentes IA. En Q2BSTUDIO combinamos arquitectura robusta con prácticas modernas para que tu software a medida escale con seguridad, gobernanza de datos y observabilidad.
Si buscas un partner con experiencia real en diseño de dominio, orquestación en servicios cloud aws y azure, despliegues seguros y pipelines de datos listos para power bi, hablamos el mismo idioma. Descubre cómo abordamos proyectos de software a medida y aplicaciones a medida desde la concepción hasta la operación, y cómo aplicamos ia para empresas en casos de uso reales, desde clasificación y recomendación hasta automatización de procesos con calidad de datos y trazabilidad.
¿Quieres potenciar tu roadmap de inteligencia artificial con datos bien modelados y pipelines gobernados? Conoce nuestra propuesta en inteligencia artificial y cómo combinamos MLOps, ciberseguridad y arquitectura en la nube para acelerar resultados.
Resumen accionable
1 Nombra y versiona de forma explícita, evita ambigüedades y dependencias del ORM. 2 Modela la semántica del borrado y del estado con campos claros y defaults sincronizados con la base de datos. 3 Prefiere TextChoices y constantes en mayúsculas para estados y permisos. 4 Usa null true en CharField cuando no sea obligatorio y olvida el default vacío. 5 Evita ediciones manuales de migraciones y rasgos de motor que limiten portabilidad. 6 No tengas miedo de desnormalizar cuando mantenga tu lógica de dominio clara. Con estas prácticas, tus modelos de Django quedarán listos para escalar con calidad, seguridad y velocidad, habilitando mejores productos digitales y analítica de valor.