1 de abril de 2019
Bienvenido a Django 2.2!
Estas notas de lanzamiento cubren las nuevas características, así como algunos cambios incompatibles con la versión anterior que deseas estar al tanto cuando actualices desde Django 2.1 o versiones anteriores. Hemos comenzado el proceso de desactivación para algunas características:ref:desactivadas en Django 2.2>.
Consulte la guía Cómo actualizar Django a una versión más reciente si estás actualizando un proyecto existente.
Django 2.2 se designa como una versión de soporte a largo plazo. Recibirá actualizaciones de seguridad durante al menos tres años después de su lanzamiento. El soporte para la versión LTS anterior, Django 1.11, terminará en abril de 2020.
Django 2.2 admite Python 3.5, 3.6, 3.7, 3.8 (a partir de la versión 2.2.8) y 3.9 (a partir de la versión 2.2.17). Muy recomendamos y solo oficialmente respaldamos la última versión de cada serie.
La nueva clase CheckConstraint y la clase UniqueConstraint permiten agregar restricciones de base de datos personalizadas. Las restricciones se agregan a los modelos utilizando la opción Meta.constraints.
django.contrib.admin¶Agregó una clase CSS a las cabeceras de columna de :class:`~django.contrib.admin.TabularInline `.
django.contrib.auth¶La solicitud HTTP (HttpRequest) se pasa ahora como el primer argumento posicional a :meth:``RemoteUserBackend.configure_user`, si lo acepta.
django.contrib.gis¶django.contrib.postgres¶La nueva argumento ordering para ArrayAgg y StringAgg determina el ordenamiento de los elementos agrupados.
La nueva clase BTreeIndex, HashIndex y SpGistIndex permiten crear índices B-Tree, hash y SP-GiST en la base de datos.
BrinIndex ahora tiene el parámetro autosummarize.
El nuevo parámetro search_type de SearchQuery permite buscar una frase o expresión bruta.
django.contrib.archivos_estáticos¶Se han agregado patrones de coincidencia de ruta al parámetro –ignore de la opción collectstatic, por lo que se pueden utilizar patrones como /vendor/*.js.
Se ha agregado streaming de resultados para el método QuerySet.iterator() en SQLite.
La nueva función de hook View.setup inicia las atributos de la vista antes de llamar a dispatch(). Esto permite que los mixines establezcan atributos de instancia para su reutilización en clases hijas.
Se ha agregado soporte y traducciones para el idioma armenio.
La nueva opción --force-color fuerza la colorización del resultado de la orden.
El comando inspectdb ahora crea modelos para tablas extranjeras en PostgreSQL.
La opción inspectdb –include-views ahora crea modelos para vistas materiales en Oracle y PostgreSQL.
La nueva opción inspectdb –include-partitions permite crear modelos para tablas de partición en PostgreSQL. En versiones anteriores, se crean tablas hijas en lugar del padre.
El comando inspectdb ahora introspecciona DurationField en Oracle y PostgreSQL, y AutoField en SQLite.
En Oracle, el comando dbshell se envuelve con rlwrap, si está disponible. rlwrap proporciona una historia de comandos y edición del input de teclado.
La traducción de los textos es la siguiente:
runserver puede utilizar ahora a Watchman para mejorar el rendimiento al vigilar un gran número de archivos por cambios.
La nueva opción migrate --plan imprime la lista de operaciones de migración que se realizarán.
Ahora se puede serializar NoneType en las migraciones.
Puedes registrar ahora serializadores personalizados para las migraciones:ref:<custom-migration-serializers>.
Se ha agregado soporte para clases de operadores PostgreSQL (Index.opclasses).
Se ha agregado soporte para índices parciales (Index.condition).
Se han agregado las funciones de base de datos NullIf y Reverse, así como muchas otras funciones de base de datos:ref:<math-functions>.
Estableciendo el nuevo parámetro ignore_conflicts de la función QuerySet.bulk_create() en True, se le dice al servidor de bases de datos que ignore los conflictos al intentar insertar filas que violan las restricciones de unicidad o otras comprobaciones.
La nueva función ExtractIsoYear extrae años de numeración ISO-8601 de DateField y DateTimeField, y la nueva búsqueda iso_year permite consultar por un año de numeración ISO-8601.
La traducción de los textos es la siguiente:
Django ya no inicia siempre una transacción cuando se está realizando una sola consulta, como Model.save(), QuerySet.update(), y Model.delete(). Esto mejora el rendimiento de autocommit reduciendo el número de viajes de red a la base de datos.
Se ha agregado soporte para SQLite en las funciones StdDev y Variance.
Se ha agregado el manejo de DISTINCT de agregación al clase Aggregate. Al agregar la atributo allow_distinct = True como un atributo de clase en las subclases de Aggregate, se permite especificar el argumento distinct en la inicialización para asegurarse de que la función agregada solo se llama para cada valor distinto de expressions.
Los métodos RelatedManager.add(), create(), remove(), set(), get_or_create(), y update_or_create() ahora están permitidos en las relaciones muchos-a-muchos con modelos intermedios. El nuevo argumento through_defaults se utiliza para especificar valores para nuevas instancias del modelo intermedio.
Se ha agregado el atributo HttpRequest.headers para acceder de manera simple a los encabezados de una solicitud.
Ahora puedes deserializar datos utilizando claves naturales que contienen referencias hacia adelante <natural-keys-and-forward-references> pasando handle_forward_references=True a serializers.deserialize(). Además, loaddata maneja las referencias hacia adelante automáticamente.
El nuevo método de aserción SimpleTestCase.assertURLEqual() verifica una URL dada ignorando el ordenamiento del parámetro de consulta. El método de aserción assertRedirects utiliza la nueva aserción.
La clase de prueba Client ahora admite la serialización automática de JSON de listas y tuplas data cuando content_type='application/json'.
El nuevo parámetro de configuración ORACLE_MANAGED_FILES permite utilizar tablespaces Oracle Managed Files (OMF).
Los textos traducidos son:
DiscoverRunner ahora ignora la configuración de bases de datos que no se mencionan en las pruebas.
El nuevo atributo ResolverMatch.route almacena el camino de la pauta de URL correspondiente.
MaxValueValidator, MinValueValidator, MinLengthValidator y MaxLengthValidator ahora aceptan un valor callable limit_value.
Esta es la traducción de los textos:
Los backends de bases de datos de terceros deben implementar el soporte para las restricciones de verificación de tablas o establecer DatabaseFeatures.supports_table_check_constraints a False.
Los backends de bases de datos de terceros deben implementar el soporte para ignorar restricciones o errores de unicidad al insertar o establecer DatabaseFeatures.supports_ignore_conflicts a False.
Los backends de bases de datos de terceros deben implementar la introspección para DurationField o establecer DatabaseFeatures.can_introspect_duration_field a False.
Ahora DatabaseFeatures.uses_savepoints tiene un valor por defecto de True.
Los backends de bases de datos de terceros deben implementar el soporte para índices parciales o establecer DatabaseFeatures.supports_partial_indexes a False.
Los textos traducidos son:
La generación de SQL para índices se ha movido desde Index a SchemaEditor y se han agregado estos métodos de SchemaEditor:
_create_primary_key_sql() y _delete_primary_key_sql()
_delete_index_sql() (para ir junto con _create_index_sql())
_delete_unique_sql (para ir junto con _create_unique_sql())
_delete_fk_sql() (para ir junto con _create_fk_sql())
_create_check_sql() y _delete_check_sql()
El tercer argumento de DatabaseWrapper.__init__(), allow_thread_sharing, se ha eliminado.
ModelAdmin¶Por ejemplo, en versiones antiguas de Django:
from django.contrib import admin
class BaseAdmin(admin.ModelAdmin):
actions = ["a"]
class SubAdmin(BaseAdmin):
actions = ["b"]
Los textos traducidos son:
Ahora acciones sigue la herencia estándar de Python. Para obtener el mismo resultado que antes:
class SubAdmin(BaseAdmin):
actions = BaseAdmin.actions + ["b"]
django.contrib.gis¶Se ha dejado de apoyar GDAL 1.9 y 1.10.
TransactionTestCase¶Las migraciones de datos iniciales se cargan ahora en TransactionTestCase al final del test, después de la limpieza de la base de datos. En versiones anteriores, esta data se cargaba al principio del test, pero esto impide que la opción test --keepdb funcione correctamente (la base de datos estaba vacía al final del conjunto completo de tests). Este cambio no debería tener un impacto en tus tests a menos que hayas personalizado los internos de TransactionTestCase.
sqlparse es dependencia requerida¶Para simplificar algunas partes del manejo de bases de datos de Django, sqlparse 0.2.2+ es ahora una dependencia requerida. Se instala automáticamente junto con Django.
cached_property¶En uso como:
from django.utils.functional import cached_property
class A:
@cached_property
def base(self):
return ...
alias = base
alias no está cacheado. Donde el problema se puede detectar (Python 3.6 y posterior), tal uso ahora levanta TypeError: No se pueden asignar el mismo cached_property a dos nombres diferentes ('base' y 'alias').
Usa esto en su lugar:
import operator
class A:
...
alias = property(operator.attrgetter("base"))
Las permisos para modelos de proxy se crean ahora utilizando el tipo de contenido del modelo de proxy en lugar del tipo de contenido del modelo concreto. Una migración actualizará los permisos existentes cuando ejecutes migrate.
En el panel de administración, la modificación es transparente para modelos de proxy que tengan el mismo app_label que su modelo concreto. Sin embargo, en versiones anteriores, los usuarios con permisos para un modelo de proxy con un diferente app_label que su modelo concreto no podían acceder al modelo en el panel de administración. Eso ya está resuelto, pero es posible que desees auditar las asignaciones de permisos para tales modelos de proxy ([add|view|change|delete]_myproxy) antes de actualizar para asegurarte de que el nuevo acceso sea apropiado.
Finalmente, las cadenas de permisos de modelos proxy deben actualizarse para utilizar su propio app_label. Por ejemplo, si app.MyProxyModel hereda de other_app.ConcreteModel, actualizar user.has_perm('other_app.add_myproxymodel') a user.has_perm('app.add_myproxymodel').
Los activos de Media ahora se fusionan utilizando un algoritmo de ordenación topológica, ya que el antiguo algoritmo de fusión par a par es insuficiente para algunos casos. Los archivos CSS y JavaScript que no incluyen sus dependencias pueden ser ordenados incorrectamente (donde el antiguo algoritmo producía resultados correctamente por casualidad).
Audita todas las clases de Media para cualquier dependencia faltante. Por ejemplo, los widgets que dependen de django.jQuery deben especificar js=['admin/js/jquery.init.js', ...] cuando declara activos de media en un formulario.
Para mejorar la legibilidad, el campo de formulario UUIDField ahora muestra valores con guiones, por ejemplo 550e8400-e29b-41d4-a716-446655440000 en lugar de 550e8400e29b41d4a716446655440000.
En SQLite, PositiveIntegerField y PositiveSmallIntegerField ahora incluyen una restricción de verificación para prevenir valores negativos en la base de datos. Si tienes datos existentes inválidos y ejecutas una migración que recrea una tabla, verás CHECK constraint failed.
Para consistencia con los servidores WSGI, el cliente de prueba ahora establece la cabecera Content-Length como una cadena en lugar de un entero.
El valor de retorno de django.utils.text.slugify() ya no está marcado como seguro para HTML.
El carácter de truncamiento por defecto utilizado por los filtros de plantilla urlizetrunc, truncatechars, truncatechars_html, truncatewords, y truncatewords_html ahora es el caracter de ellipsis real (…) en lugar de 3 puntos. Es posible que debas adaptar algunas comparaciones de salida de pruebas.
Se ha eliminado el soporte para rutas de bytestring en el cargador de filesystem de plantilla.
django.utils.http.urlsafe_base64_encode() ahora devuelve una cadena en lugar de un bytestring, y django.utils.http.urlsafe_base64_decode() ya no puede recibir un bytestring.
Se ha eliminado el soporte para cx_Oracle < 6.0.
La versión mínima soportada de mysqlclient se incrementa desde 1.3.7 a 1.3.13.
La versión mínima soportada de SQLite se incrementa desde 3.7.15 a 3.8.3.
En un intento por proporcionar más datos de consulta semánticos, NullBooleanSelect ahora renderiza valores <option> de unknown, true, y false en lugar de 1, 2, y 3. Para compatibilidad hacia atrás, los valores antiguos todavía se aceptan como datos.
La longitud máxima del atributo Group.name se incrementa desde 80 a 150 caracteres.
Los tests que violan las restricciones de la base de datos ahora generan un error cuando se ejecutan en SQLite 3.20+, exactamente como en otros backends que admiten tales restricciones.
Para capturar errores de uso, el test Client y la función django.utils.http.urlencode() ahora levantan una TypeError si se pasa None como valor a codificar porque None no puede ser codificado en datos GET y POST. Se debe pasar una cadena vacía o omitir el valor.
El comando de administración ping_google ahora tiene como valor por defecto https en lugar de http para la URL del mapa del sitio. Si su sitio utiliza http, utilice la nueva opción --sitemap-uses-http. Si utiliza la función django.contrib.sitemaps.ping_google, establezca el nuevo argumento sitemap_uses_https a False.
runserver ya no admite pyinotify (reemplazado por Watchman).
Las funciones de agregación Avg, StdDev y Variance ahora devuelven un Decimal en lugar de un float cuando la entrada es un Decimal.
Los tests fallarán en SQLite si las aplicaciones sin migraciones tienen relaciones con aplicaciones que tienen migraciones. Esto ha sido una restricción documentada desde que se agregaron las migraciones en Django 1.7, pero ahora falla de manera más fiable. Verá tests fallando con errores como no such table: <app_label>_<model>. Esto se observó con varias aplicaciones terceras que tenían modelos en tests sin migraciones. Debe agregar migraciones para tales modelos.
Proporcionar un entero en el argumento key de la función cache.delete() o cache.get() ahora levanta una ValueError.
Las ecuaciones plurales para algunos idiomas se han cambiado, porque las últimas versiones de Transifex se incorporan.
Nota
Se agregó la capacidad de manejar archivos .po que contienen ecuaciones plurales diferentes para el mismo idioma en Django 2.2.12.
Meta.ordering ya no afectará a las consultas de agrupación.¶La influencia del modelo Meta.ordering en las consultas de agrupación (como .annotate().values()) es una fuente común de confusión. Ahora tales consultas emiten un aviso de desprecación con el consejo de agregar un order_by() para mantener la consulta actual. A partir de Django 3.1, Meta.ordering se ignorará en tales consultas.
django.utils.timezone.FixedOffset está desprecado a favor de datetime.timezone.
La alias no documentada QuerySetPaginator de django.core.paginator.Paginator está desprecada.
El modelo y los campos de formulario FloatRangeField en django.contrib.postgres están desprecados a favor de un nuevo nombre, DecimalRangeField, para coincidir con el tipo de datos numrange subyacente utilizado en la base de datos.
La configuración FILE_CHARSET está desprecada. A partir de Django 3.1, los archivos leídos desde disco deben estar codificados en UTF-8.
django.contrib.staticfiles.storage.CachedStaticFilesStorage está desprecado debido a los problemas intractables que tiene. Utilice ManifestStaticFilesStorage o una almacenamiento de nube de terceros en su lugar.
La función configure_user de la clase RemoteUserBackend ahora recibe request como el primer argumento posicional, si lo acepta. El soporte para sobrecargas que no lo aceptan se eliminará en Django 3.1.
Las propiedades SimpleTestCase.allow_database_queries, TransactionTestCase.multi_db y TestCase.multi_db están desprecadas a favor de SimpleTestCase.databases, TransactionTestCase.databases y TestCase.databases. Estas nuevas propiedades permiten declarar dependencias de bases de datos para prevenir consultas inesperadas contra bases de datos no predeterminadas que puedan propagar estado entre pruebas. El comportamiento anterior de allow_database_queries=True y multi_db=True se puede lograr estableciendo databases='__all__'.
may 31, 2026