Las cookies nos permiten ofrecer nuestros servicios. Al utilizar nuestros servicios, aceptas el uso que hacemos de las cookies. Más Información. Aceptar

Django 1.11 contará con soporte al menos tres años

Daniel Ortego Delgado
  • Escrito por Daniel Ortego Delgado el 20 de Abril de 2017
  • 1 min de lectura | Programación
Django 1.11 contará con soporte al menos tres años

Django, el famoso framework de desarrollo open source, acaba de estrenar nueva versión. Escrito en Python y basado en el patrón de diseño Modelo-Vista-Controlador, es uno de los frameworks favoritos de Python en los últimos tiempos y el más potente sin duda. La clave de esta nueva versión es que tendrá soporte durante, como mínimo, los próximos tres años, por lo que supone una gran opción a tener en cuenta si contemplabas trabajar con otros frameworks.

¿Cuáles son las novedades?

  • El nuevo módulo django.db.models.indexes contiene clases que facilitan la creación de índices de base de datos. Esta característica permite crear índices compuestos y personalizados para bases de datos. Los índices personalizados proporcionan una mejor optimización para las consultas de bases de datos y pueden acelerar el tiempo de respuesta de estas.
  • Facilidad para la personalización de widgets de formulario basados en plantillas. Esta característica había sido muy demandada desde hacía mucho tiempo por los usuarios y por fin cuenta con ella esta versión. Para los desarrolladores ha sido una pesadilla sacar adelante esta función. Aunque por el momento simplemente están utilizando API, y esta característica parece poco útil, sigue siendo una mejora muy importante que facilitará la personalización de los formularios estándar.
  • Expresiones subquery para crear subqueries explícitas mediante el ORM. Esta característica es muy interesante porque Django 1.8 introdujo expresiones condicionales para Django ORM. Las expresiones subquery amplían las capacidades de ORM. Como resultado, puede crear funciones aún más complejas sin consultas SQL.

Ahora se puede añadir una subquery explícita a un QuerySet mediante la expresión Subquery. Por ejemplo, para anotar cada mensaje con la dirección de correo electrónico del autor del comentario más reciente en esa publicación, se haría lo siguiente:

>>> from django.db.models import OuterRef, Subquery
>>> newest = Comment.objects.filter(post=OuterRef('pk')).order_by('-created_at')
>>> Post.objects.annotate(newest_commenter_email=Subquery(newest.values('email')[:1]))

Mientras que en PostgreSQL, el código sería:

SELECT "post"."id", (  
    SELECT U0."email"
    FROM "comment" U0
    WHERE U0."post_id" = ("post"."id")
    ORDER BY U0."created_at" DESC LIMIT 1
) AS "newest_commenter_email" FROM "post"

Referenciando columnas desde consultas externas

OuterRef se utiliza cuando un grupo de consultas en una subquery referencia al campo de una consulta externa. Las instancias de OuterRef se pueden utilizar junto con instancias anidadas de Subquery para referirse a un conjunto de consultas que no es el padre inmediato. Por ejemplo, este queryset debería estar dentro de un par anidado de instancias de Subquery para funcionar correctamente:

>>> Book.objects.filter(author=OuterRef(OuterRef('pk')))

Exists() subqueries

Exists es una subclase Subquery que utiliza una sentencia SQL EXISTS. En muchos casos funcionará mejor que una subquery ya que la base de datos es capaz de detener la evaluación de la subquery cuando encuentra resultado en la primera fila.

Por ejemplo, para listar cada mensaje según si tiene o no un comentario desde el último día escribiríamos:

>>> from django.db.models import Exists, OuterRef
>>> from datetime import timedelta
>>> from django.utils import timezone
>>> one_day_ago = timezone.now() - timedelta(days=1)
>>> recent_comments = Comment.objects.filter(
...     post=OuterRef('pk'),
...     created_at__gte=one_day_ago,
... )
>>> Post.objects.annotate(recent_comment=Exists(recent_comments))

Y en PostgreSQL sería el siguiente:

SELECT "post"."id", "post"."published_at", EXISTS(  
    SELECT U0."id", U0."post_id", U0."email", U0."created_at"
    FROM "comment" U0
    WHERE (
        U0."created_at" >= YYYY-MM-DD HH:MM:SS AND
        U0."post_id" = ("post"."id")
    )
) AS "recent_comment" FROM "post"

Con esta nueva versión, se empieza a dejar de dar soporte a la versión 1.10, que se mantendrá hasta diciembre de 2017.

Estas son algunas de las empresas que ya confían en OpenWebinars

Profesores y profesionales

Nuestros docentes son profesionales que trabajan día a día en la materia que imparten

Conviértete en profesor de OpenWebinars