Contenidos

ORM y modelos

ORM (Object Relational Mapping), en palabras sencillas, es la relación entre una base de datos relacional y la programación orientada a objetos, esto lo logramos ayudándonos de librerías o frameworks.

Una base de datos se compone de tablas que contienen los datos de una entidad en particular, y a través de un ORM podemos convertir una base de datos en un archivo del lenguaje de programación requerido, el archivo será la representación en programación orientada a objetos de cada una de las tablas de la base de datos. Las tablas, en un archivo del lenguaje, se llamarán modelos (models), creados en forma de clases.

Un modelo básicamente es la réplica de una tabla en programación orientada a objetos, y se crea a partir de clases.

Tomemos como ejemplo una tabla Users, con los campos pk de tipo int, username de tipo varchar y password de tipo hash; al pasarla a programación orientada a objetos, tendremos una clase Users con los atributos pk como objeto de la clase int, username como objeto de la clase varchar (o equivalente) y password como objeto de la clase hash (o equivalente).

Untitled

Creando un diagrama entidad relación para nuestro proyecto

Tabla Questions:

Question tendrá una relación de 1 a muchos con Choices, porque una pregunta puede tener múltiples opciones, pero una opción pertenece sólo a una pregunta.

Tabla Choices:

Untitled

Creando modelos Question y Choice

La aplicación polls tiene un archivo llamado models.py, y aquí es donde vamos a definir nuestros modelos. En general las clases que representan los modelos, heredan de la clase Model que brinda Django. El campo id no es necesario definirlo, porque esto se hace de forma automática, siendo un entero auto-incremental que empieza en 1.

La clase models (superclase de Model) tiene subclases que ayudan a representar el tipo de dato de un campo en la en la base de datos, dichas subclases contienen en su nombre la palabra “Field” (campo).

# Archivo premiosPlatzi/polls/models.py
from django.db import models

# Las tablas de la base de datos son clases en Django.
class Question(models.Model):
    # Los atributos de la clase corresponden a los campos de la tabla.
    question_text = models.CharField(max_length=200) # Recibe como parámetro el máximo de caracteres permitidos
    pub_date = models.DateTimeField('date published') # Recibe la descripción del campo

class Choice(models.Model):
    # ForeignKey recibe la clase a la que corresponde la llave foránea y qué se debe hacer en caso de que se borre el registro que se relaciona.
    # En este caso, al borrarse una pregunta (Question), se borrarán también sus opciones (Choice).
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0) # El contador de votos empieza en 0