Thumbnail: django

La Biblioteca, aplicación en Django 1.8 | Parte II

por , en la categoría de Django
8 minuto(s) de lectura
Este artículo hace parte de la serie «Django dummies»:
  1. La Biblioteca, aplicación en Django 1.8 | Parte I
  2. La Biblioteca, aplicación en Django 1.8 | Parte II
  3. La Biblioteca, aplicación en Django 1.8 | Parte III
  4. La Biblioteca, aplicación en Django 1.8 | Parte IV
  5. La Biblioteca, aplicación en Django 1.8 | Parte V
  6. La Biblioteca, aplicación en Django 1.8 | Parte VI
  7. La Biblioteca, aplicación en Django 1.8 | Parte VII

En la entrada de hoy continuamos con la segunda parte de nuestra aplicación Django, hasta este momento tenemos nuestro proyecto (llamado sitiolectura) y nuestra aplicación (llamada biblioteca) creada y registrada correctamente, hoy vamos a enfocarnos en los modelos de la app y Django nos ofrece facilidades enormes para tal propósito. Supongo que ya sabes qué son los modelos en un aplicativo de software, mas sin embargo, por respeto, diré acogiéndome a la definición textual que:

El Modelo es la representación de la información con la cual el sistema opera.

Los modelos pues, son las definiciones de nuestra base de datos (hablando a groso modo). En nuestra aplicación supondremos que un Libro puede tener mas de un Autor, y un Autor puede escribir mas de un Libro (relación ManyToMany entre Libro y Autor), además supondremos que un Editor puede distribuir muchos Libros, pero un Libro solo puede ser distribuido por un solo Editor (relación OneToMany entre Libro y Editor, también conocida como ForeignKey). Nuestras tablas (entidades) en la base de datos serán entonces Libro, Editor y Autor con las relaciones anteriormente descritas. Dicho esto, comencemos.

Crear nuestra base de datos inicial:

Como ya dije en el post anterior, Django nos instala por defecto algunas apps convenientes y que nos ayudan en un montón de cosas (usuarios, permisos, grupos, admin, etc.), dichas apps por defecto tienen también sus modelos. Para crear tu base de datos abre la terminal y ve al directorio donde se encuentre el archivo manage.py, en mi caso es: C:/users/Carlos/Desktop/virtual-biblioteca/sitiolectura y coloca lo siguiente: python manage.py migrate.

Este comando te creará una base de datos con los modelos definidos en las apps por defecto, por lo que si eres curioso verás en esta primera BBDD habrán tablas llamadas auth_user, auth_group, django_session, etc. Cabe agregar que la base de datos estará ubicada en virtual-biblioteca/sitiolectura con el nombre de db.sqlite3

BBDDinicial

Cosas por decir acá:

  1. El sistema gestor de base de datos que usa Django por default es SQLite, por lo que tu BBDD estará construida en SQLite.

  2. Quizás quieras descargar un complemento de Mozilla para administrar bases de datos SQLite, te facilitará mucho la vida.

  3. Además de SQLite, Django también soporta Sistemas gestores como MySQL o PostgreSQL, si quieres trabajar con alguno de ellos, puedes leer la documentacion al respecto.

  4. Si quieres cambiar el nombre de tu BBDD es recomendable que te dirijas a settings.py y cambies tal configuración, así:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'biblioteca.sqlite3'),#cambias db.sqlite3 por, por ejemplo, biblioteca.sqlite3
    }
}

Crear nuestro modelo de datos

Ahora que ya hemos creado nuestra base de datos inicial, crearemos nuestro propio modelo de datos para nuestra biblioteca. Ve a la carpeta biblioteca y abre el archivo models.py, este archivo será donde irán las definiciones de nuestro modelos para esta app, dentro de este archivo coloca lo siguiente:

#biblioteca/models.py

from django.db import models

class Editor(models.Model):
	'''Un editor tiene un nombre, un domicilio, una ciudad, un estado, un pais y un sitio web'''
	nombre = models.CharField(max_length=30)#el atributo nombre tendra maximo 30 caracteres
	domicilio = models.CharField(max_length=50)
	ciudad = models.CharField(max_length=60)
	estado = models.CharField(max_length=30)
	pais = models.CharField(max_length=50)#el atributo pais tendra maximo 50 caracteres
	website = models.URLField()

	def __unicode__(self):#__str__ para python 3
		return self.nombre
#______________________________________________________________________			
class Autor(models.Model):
	'''Un autor tiene un nombre, un apellido y un email'''
	nombre = models.CharField(max_length=30)
	apellido = models.CharField(max_length=40)
	email = models.EmailField(blank=True)#La BBDD aceptara valores vacios para este atributo

	def __unicode__(self):#__str__ para python 3
		cadena = "%s %s" %(self.nombre, self.apellido)
		return cadena	
#______________________________________________________________________
class Libro(models.Model):
	titulo = models.CharField(max_length=100)
	autores = models.ManyToManyField(Autor)
	editor = models.ForeignKey(Editor)
	fecha_publicacion = models.DateField()
	portada = models.ImageField(upload_to = 'portadas/')#Crea una carpeta llamada portadas, donde guardara las imagenes de portadas de libros, al final la imagen tendra que cargarse en: media/portadas/, eso lo veremos luego
	sinopsis = models.TextField(blank=True)
	
	def __unicode__(self):#__str__ para python 3
		return self.titulo

Este archivo le da a Django mucha información con respecto a nuestra BBDD. Cada clase especificada en models.py se traducirá como una tabla en la base de datos, y cada atributo de clase, será traducido como una columna de tabla. Además cada instancia de clase será traducida por Django como un registro de la base de datos.

Cosas por decir acá:

  1. Django automáticamente le da a cada tabla en nuestra base de datos una llave primaria, que se llamará id.

  2. Las tablas creadas seguirán el formato <name_app>_<name_clase>, por lo que para Libro, su correspondiente tabla en la BBDD será biblioteca_libro.

  3. Cada atributo de clase es una instancia de la clase models, te dejo la lista de los tipos de atributos disponibles (hay enteros, de tipo binarios, de tipo fecha)

  4. El método __unicode__ nos ayudará a identificar al objeto con el cual estamos interactuando, si no lo entiendes ahora, no te preocupes, luego verás la utilidad de este método mágico.

  5. el atributo editor en la clase Libro hace referencia a la clase Editor pues es una llave foránea.

  6. para los atributos ManyToMany, como es el caso de autores en la clase Libros, Django automáticamente construye una tabla intermedia para acceder a los atributos de uno y otro, en nuestro caso dicha tabla es biblioteca_libros_autores

Ya escribimos el modelo de datos, pero no le hemos dicho a Django que haga lo suyo, las tablas y todo lo demás aún no han sido creadas, vamos a cambiar eso.

Activar el modelo de datos en la base de datos

Abrimos una terminal y nos dirigimos al directorio donde está ubicado manage.py, luego escribimos:

  1. python manage.py makemigrations, tendrá que salirte algo como esto makemigrations

    Hasta este paso hemos hecho las migraciones de nuestros modelos, pero aun no se han aplicado los cambios a nuestra BBDD (para los que han trabajado con GIT, puedes pensar en esto como si hubiésemos hecho un “commit”, pero no el “push”), puedes ver que en la carpeta migrations hay un archivo, nuestra primera migración. Nuestra información está lista para ser insertada en nuestra BBDD en forma de SQL.

  2. si quieres ver el SQL generado a partir de nuestros modelos digíta: python manage.py sqlmigrate biblioteca 0001. Este comando es útil para saber las acciones que vamos a introducir en forma de SQL en nuestra BBDD antes de hacerlo.

  3. Ahora vamos a hacer efectivos los cambios. Pon python manage.py migrate, con esto habremos modificado la BBDD.

migrate

RECORDEMOS: los 3 pasos para hacer cambios en la base de datos son:

  • Cambiar algo en nuestros modelos (en models.py).

  • Correr python manage.py makemigrations para crear las migraciones correspondientes a esos cambios

  • Correr python manage.py migrate para aplicar esos cambios a la base de datos.

Y eso es todo, si tienen alguna duda o problema al respecto, pueden hacérmelo saber mas abajo en la caja de comentarios. Gracias por leer y comentar.

print("Hasta pronto")

Siguiente artículo en la serie: La Biblioteca, aplicación en Django 1.8 | Parte III

aplicacion, Django 1.8, Biblioteca
comments powered by Disqus