que no se invoca el método save().
Recuperar objetos
El Object-Relational Mapper (ORM) se basa en QuerySets. Un QuerySet es una colección de objetos de la base de datos que puede tener múltiples filtros para reducir el número de resultados. Ya sabe cómo recuperar un único objeto de la base de datos a través del método get(). Se ha hecho uso de él en Post.objects.get(). Cada modelo de Django tiene al menos un manager que, por defecto, se llama objects. Se puede obtener un objeto QuerySet a través del gestor de modelos. Si quisiera, por ejemplo, obtener todos los objetos de una tabla, solo hay que usar el método all() del gestor por defecto:
Este es el modo en que crear un objeto QuerySet que devuelva todos los objetos en una base de datos. Es importante mencionar, que este QuerySet no se ha ejecutado aún en la base de datos. Los QuerySets en Django tienen un comportamiento perezoso (lazy), es decir, solo se evalúan cuando son forzados a ello, dando como resultado un comportamiento muy eficiente. Si en vez de asignar el QuerySet a una variable, lo escribe en la shell de Python, la sentencia SQL del QuerySet se ejecuta, porque se ha forzado a que los resultados aparezcan por pantalla:
Valiéndose del método filter()
Para filtrar un QuerySet se puede valer del método filter() del gestor. Por ejemplo, para recuperar todos los artículos publicados en el año 2017, utilizaría el siguiente filtrado:
También se puede concatenar múltiples campos de filtrado. Por ejemplo, recuperando los artículos publicados en 2017 y cuyo usuario del autor sea admin:
Esto es lo mismo que construir el mismo QuerySet con múltiples filtros:
Uso de exclude()
Se pueden excluir resultados del QuerySet a través del método exclude() del gestor. Por ejemplo, se pueden recuperar todos los posts publicados en 2017 cuyos títulos no empiezan por “Why”:
Uso de order_by()
Los resultados se pueden ordenar con los campos a través del método order_by() del gestor. Por ejemplo, si quisiera obtener los artículos ordenados por el campo title, los obtendría con:
El comportamiento por defecto es en orden ascendente. Si lo quisiera descendente, utilizaría el prefijo negativo del siguiente modo:
Eliminar objetos
Si quiere eliminar un objeto puede hacerlo con el método delete() del mismo:
Cuándo se evalúan los QuerySets
Ya ha visto que se pueden concatenar tantos filtros a un QuerySet como quiera, y que la base de datos no procesará la acción hasta que el QuerySet sea evaluado. Estos se evalúan en las siguientes situaciones:
• La primera vez que se itere sobre ellos.
• Cuando accedemos a un elemento/s por posición, por ejemplo, Post.objects.all()[:3].
• Cuando los seleccionamos o guardamos en caché.
• Cuando los invocamos con repr() o len().
• Cuando instanciamos una lista sobre ellos.
• Cuando realizamos una operación lógica como bool(), or, and, o if con ellos.
Crear gestores de modelos
Ya mencionamos que objects es el gestor por defecto de cualquier modelo para recuperar objetos de la base de datos. Sin embargo, también se pueden definir gestores personalizados para los modelos. Se va a crear un gestor que recupere todos los artículos con el estado published.
Existen dos maneras de añadir gestores a los modelos: añadiendo métodos a los gestores ya existentes o modificando el gestor por defecto de QuerySets. La primera proporciona un método al API del QuerySet como Post.objects. my_manager() y, la segunda, como Post.my_manager.all(). En este caso, el gestor permitirá recuperar los artículos usando Post.published.all().
Para ello editamos el fichero models.py de la aplicación blog para incluir el nuevo gestor:
El método get_queryset() de un gestor devuelve el QuerySet ejecutado. Modificamos este método para incluir el filtrado al final del QuerySet. Se ha definido el gestor personalizado y añadido al modelo Post. Con esto ya puede utilizarlo para realizar consultas.
Se va a arrancar una consola de desarrollo con el siguiente comando:
Ahora, para recuperar todos los artículos publicados cuyo título empieza por Who, se utiliza la siguiente sentencia:
Elaborar vistas de detalle y listado
Se ha visto cómo se usa el ORM de Django. A continuación, se elaboran vistas en la aplicación del blog. Una vista de Django es una función Python que recibe una solicitud web y devuelve una respuesta web. Toda la lógica de procesamiento se encuentra dentro de la vista.
Lo primero que se va a hacer es crear las vistas de la aplicación, después se definen los patrones de URL para cada una de ellas y, por último, se crean las plantillas de HTML para renderizar el contenido con los datos de la vista. Cada vista renderiza una plantilla que se completa con datos de variables. Esta renderización se devuelve en una respuesta HTTP.
Creación de vistas de detalle y listado
Se empieza con la elaboración de una vista que muestre el listado de artículos disponibles. Para ello se edita el fichero views.py de la aplicación blog con el siguiente código: