2 de diciembre de 2017
Bienvenido a Django 2.0!
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 1.11 o versiones anteriores. Hemos eliminado algunas características que han llegado a su fin de ciclo de deprecación, y hemos comenzado el proceso de deprecación para algunas características <deprecated-features-2.0>`.
Esta versión inicia el uso de Django de una forma relajada de versionamiento semántico, pero no hay cambios incompatibles con la versión anterior que podrían esperarse en un lanzamiento 2.0. La actualización debería ser similar al esfuerzo necesario para los lanzamientos de características anteriores.
Consulte la guía Cómo actualizar Django a una versión más reciente si estás actualizando un proyecto existente.
Django 2.0 admite Python 3.4, 3.5, 3.6 y 3.7. Recomendamos y solo oficialmente apoyamos la última versión de cada serie.
La traducción es la siguiente:
Django 2.0 será la última serie de lanzamientos que apoye a Python 3.4. Si planeas una implementación de Python 3.4 más allá del fin de vida para Django 2.0 (abril de 2019), sigue con Django 1.11 LTS (soportado hasta abril de 2020) en su lugar. Ten en cuenta, sin embargo, que el fin de vida para Python 3.4 es marzo de 2019.
Después del lanzamiento de Django 2.0, sugerimos que los autores de aplicaciones de terceros abandonen el soporte para todas las versiones de Django anteriores a 1.11. En ese momento, deberías poder ejecutar las pruebas de tu paquete utilizando python -Wd para que las advertencias de desuso aparezcan. Después de realizar las correcciones de advertencia de desuso, tu aplicación debe ser compatible con Django 2.0.
La nueva función django.urls.path() permite una sintaxis de ruta URL más simple y legible. Por ejemplo, este ejemplo desde versiones anteriores de Django:
url(r"^articles/(?P<year>[0-9]{4})/$", views.year_archive),
puede escribirse como:
path("articles/<int:year>/", views.year_archive),
La nueva sintaxis admite la coerción de tipos de los parámetros de la URL. En el ejemplo, la vista recibirá el argumento de palabra clave year como un entero en lugar de como una cadena. Además, las URLs que coincidirán son ligeramente menos restringidas en el ejemplo reescrito. Por ejemplo, el año 10000 ahora coincide ya que los enteros de año no están restringidos a ser exactamente cuatro dígitos largos como lo están en la expresión regular.
La función django.conf.urls.url() de versiones anteriores está disponible ahora como django.urls.re_path(). La ubicación antigua permanece para compatibilidad hacia atrás, sin una desaparición inminente. La función antigua django.conf.urls.include() ahora es importable desde django.urls para que puedas utilizar from django.urls import include, path, re_path en tus URLconfs.
La documentación Dispatcher de URL se reescribe para incluir la nueva sintaxis y proporcionar más detalles.
El administrador ahora es responsivo y admite todos los dispositivos móviles principales. Los navegadores más antiguos pueden experimentar niveles variables de degradación graciosa.
La nueva expresión Window permite agregar una cláusula OVER a los conjuntos de consultas. Puedes utilizar las funciones de ventana y las funciones agregadas en la expresión.
django.contrib.admin¶El nuevo atributo ModelAdmin.autocomplete_fields y el método ModelAdmin.get_autocomplete_fields() permiten utilizar un widget de búsqueda Select2 para ForeignKey y ManyToManyField.
django.contrib.auth¶La cuenta de iteraciones por defecto para el hasheador de contraseñas PBKDF2 se incrementa desde 36,000 a 100,000.
django.contrib.gis¶Se ha agregado soporte para MySQL a las funciones: AsGeoJSON, GeoHash, IsValid y la búsqueda de isvalid. Además, se han agregado las búsquedas de distancia: distance lookups.
Se han agregado las funciones Azimuth y LineLocatePoint, compatibles con PostGIS y SpatiaLite.
Cualquier GEOSGeometry importado desde GeoJSON ahora tiene su SRID establecido.
Se han agregado las siguientes características:
Hizo que los metadatos sean legibles y editables en rasters a través de las propiedades metadata, info y metadata.
Permitió pasar opciones de creación específicas del driver a objetos GDALRaster utilizando papsz_options.
Permitió crear objetos GDALRaster en el sistema de archivos virtual interno de GDAL. Los rasters pueden ahora ser creados y convertidos a datos binarios <gdal-raster-vsimem> en memoria.
La nueva método GDALBand.color_interp() devuelve la interpretación de color para el banda.
django.contrib.postgres¶El nuevo argumento distinct para ArrayAgg determina si los valores concatenados serán distintos.
La nueva función de base de datos RandomUUID devuelve una versión 4 UUID. Requiere el uso de la extensión pgcrypto de PostgreSQL, que se puede activar utilizando la operación de migración CryptoExtension.
La clase django.contrib.postgres.indexes.GinIndex ahora admite los parámetros fastupdate y gin_pending_list_limit.
La nueva clase GistIndex permite crear índices GiST en la base de datos. La nueva operación de migración BtreeGistExtension instala la extensión btree_gist para agregar soporte a las clases de operadores que no están integradas.
El comando inspectdb de Django ahora puede introspeccionar campos JSONField y varios campos RangeField (debe estar en INSTALLED_APPS).
Se han agregado el argumento de palabra clave protocol al constructor de la clase GenericSitemap.
Ahora cache.set_many() devuelve una lista de claves que fallaron en su inserción. Para los backends integrados, solo pueden ocurrir inserciones fallidas en memcached.
Se puede utilizar File.open() como administrador de contexto, por ejemplo with file.open() as f:.
Los nuevos argumentos date_attrs y time_attrs para las clases SplitDateTimeWidget y SplitHiddenDateTimeWidget permiten especificar atributos HTML diferentes para los subwidgets DateInput y TimeInput (o ocultos).
El nuevo método Form.errors.get_json_data() devuelve errores de formulario como un diccionario adecuado para incluir en una respuesta JSON.
La nueva atributo ContextMixin.extra_context permite agregar contexto en View.as_view().
Ahora el comando inspectdb traduce las columnas de enteros sin signo de MySQL a PositiveIntegerField o PositiveSmallIntegerField.
La nueva opción makemessages --add-location controla el formato de comentarios en los archivos .po.
El comando loaddata ahora puede leer desde stdin.
La nueva opción diffsettings --output permite formatear la salida en un formato de difunificado.
On Oracle, inspectdb puede ahora introspeccionar AutoField si la columna se crea como una columna de identidad.
En MySQL, dbshell ahora admite certificados TLS del lado del cliente.
La nueva opción squashmigrations --squashed-name permite nombrar la migración aplastada.
La nueva función de base de datos StrIndex encuentra el índice de inicio de una cadena dentro de otra cadena.
En Oracle, AutoField y BigAutoField se crean ahora como columnas de identidad.
La nueva variable chunk_size del parámetro de QuerySet.iterator() controla el número de filas fetcheadas por el cliente de base de datos de Python cuando se están streamiando resultados desde la base de datos. Para bases de datos que no admiten cursor en el lado del servidor, controla el número de resultados que Django obtiene del adaptador de base de datos.
QuerySet.earliest(), QuerySet.latest() y Meta.get_latest_by ahora permiten ordenar por varios campos.
Se agregó la función ExtractQuarter para extraer el trimestre de DateField y DateTimeField, y se expuso a través del lookup quarter.
Se agregó la función TruncQuarter para truncar DateField y DateTimeField al primer día de un trimestre.
Se agregó el parámetro db_tablespace a los índices basados en clases.
Si la base de datos admite un campo de duración nativo (Oracle y PostgreSQL), Extract ahora funciona con DurationField.
Se ha agregado el argumento of a QuerySet.select_for_update(), soportado en PostgreSQL y Oracle, para bloquear solo filas de tablas específicas en lugar de todas las tablas seleccionadas. Puede ser útil particularmente cuando se utiliza select_for_update() conjuntamente con select_related().
El nuevo parámetro field_name de QuerySet.in_bulk() permite obtener resultados basados en cualquier campo único del modelo.
CursorWrapper.callproc() ahora admite un diccionario opcional de parámetros de palabra clave, si el backend lo soporta. Solo Oracle entre los backends integrados de Django lo admite.
El nuevo método connection.execute_wrapper() permite instalar envolturas alrededor de la ejecución de consultas de base de datos.
El nuevo argumento filter para agregados integrados permite añadir condiciones diferentes a múltiples agregaciones sobre los mismos campos o relaciones.
Se ha agregado soporte para expresiones en Meta.ordering.
El nuevo parámetro named de QuerySet.values_list() permite obtener resultados como tuplas nombradas.
La nueva clase FilteredRelation permite agregar una cláusula ON a consultas.
Se agregó la función Paginator.get_page() para proporcionar el patrón documentado de manejo de números de página inválidos.
El servidor web runserver admite HTTP 1.1.
Para aumentar la utilidad de Engine.get_default() en aplicaciones terceras, ahora devuelve el primer motor si se configuran múltiples motores DjangoTemplates en TEMPLATES en lugar de levantar ImproperlyConfigured.
Los etiquetas de plantilla personalizadas pueden aceptar argumentos solo por palabra clave.
Se agregó soporte para hilos a LiveServerTestCase.
Se agregaron ajustes de configuración que permiten personalizar los parámetros del espacio de nombres de la tabla para Oracle: DATAFILE_SIZE, DATAFILE_TMP_SIZE, DATAFILE_EXTSIZE y DATAFILE_TMP_EXTSIZE.
La nueva clase ProhibitNullCharactersValidator prohíbe el carácter nulo en la entrada del campo de formulario CharField y sus subclases. Se observó que se introducían caracteres nulos desde herramientas de escaneo de vulnerabilidades. La mayoría de las bases de datos descartan silenciosamente los caracteres nulos, pero psycopg2 2.7+ levanta una excepción cuando intenta guardar un carácter nulo en un campo char/text con PostgreSQL.
Para admitir cadenas nativas de Python 2, las versiones antiguas de Django tenían que aceptar tanto cadenas de bytes como cadenas Unicode. Dado que se ha dejado de admitir Python 2, las cadenas de bytes solo deberían encontrarse alrededor de los límites de entrada/salida (manejo de campos binarios o flujos HTTP, por ejemplo). Es posible que debas actualizar tu código para limitar el uso de cadenas de bytes al mínimo, ya que Django ya no acepta cadenas de bytes en ciertas rutas de código. La opción -b de Python puede ayudarte a detectar ese error en tu código.
Los métodos reverse() ahora utilizan str() en lugar de force_text() para coercer los argumentos y los parámetros que recibe, antes de su colocación en la URL. Por bytestrings, esto crea una cadena con un prefijo indeseado b así como comillas adicionales (str(b'foo') es "b'foo'"). Para adaptarse, llama a decode() sobre el bytestring antes de pasarla a reverse().
Esta es la traducción de los textos:
Los métodos DatabaseOperations.datetime_cast_date_sql(), datetime_cast_time_sql(), datetime_trunc_sql(), datetime_extract_sql(), y date_interval_sql() ahora devuelven solo la SQL para realizar la operación en lugar de la SQL y una lista de parámetros.
Los backends de bases de datos terceros deben agregar un atributo DatabaseWrapper.display_name con el nombre de la base de datos que su backend trabaja. Django puede utilizarlo en mensajes diversos, como en los controles del sistema.
El primer argumento de SchemaEditor._alter_column_type_sql() ahora es model en lugar de table.
El primer argumento de SchemaEditor._create_index_name() ahora es table_name en lugar de model.
Para habilitar el soporte para FOR UPDATE OF, establece DatabaseFeatures.has_select_for_update_of = True. Si la base de datos requiere que los argumentos a OF sean columnas en lugar de tablas, establece DatabaseFeatures.select_for_update_of_column = True.
Para habilitar el soporte para las expresiones Window, establece DatabaseFeatures.supports_over_clause a True. Es posible que debas personalizar los métodos DatabaseOperations.window_start_rows_start_end() y/o window_start_range_start_end().
Los backends de bases de datos terceros deben agregar un atributo DatabaseOperations.cast_char_field_without_max_length con el tipo de dato de la base de datos que se utilizará en la función Cast para un campo CharField si no se proporciona el argumento max_length.
El primer argumento de DatabaseCreation._clone_test_db() y get_test_db_clone_settings() ahora es suffix en lugar de number (en caso de que desees renombrar las firmas en tu backend para consistencia). django.test también pasa esos valores como cadenas en lugar de como enteros.
Los backends de bases de datos terceros deben agregar un método DatabaseIntrospection.get_sequences() basado en el stub en BaseDatabaseIntrospection.
El fin del soporte upstream para Oracle 11.2 es Diciembre de 2020. Django 1.11 será soportado hasta Abril de 2020 lo que casi alcanza esta fecha. Django 2.0 oficialmente admite Oracle 12.1+.
El nivel de aislamiento por defecto de MySQL, repeatable read, puede causar pérdida de datos en el uso típico de Django. Para evitar eso y para la consistencia con otras bases de datos, el nivel de aislamiento por defecto ahora es read committed. Puedes usar la configuración DATABASES para usar un diferente nivel de aislamiento, si es necesario.
AbstractUser.last_name max_length aumentado a 150¶Se incluye una migración para django.contrib.auth.models.User.last_name. Si tienes un modelo de usuario personalizado que hereda de AbstractUser, necesitarás generar y aplicar una migración de base de datos para tu modelo de usuario.
Si deseas preservar la limitación de 30 caracteres para los apellidos, utiliza un formulario personalizado:
from django.contrib.auth.forms import UserChangeForm
class MyUserChangeForm(UserChangeForm):
last_name = forms.CharField(max_length=30, required=False)
Si deseas mantener esta restricción en el administrador al editar usuarios, establece UserAdmin.form para usar este formulario:
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
class MyUserAdmin(UserAdmin):
form = MyUserChangeForm
admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
QuerySet.reverse() y last() están prohibidos después de la slicing¶Llamar a QuerySet.reverse() o last() en un queryset cortado conduce a resultados inesperados debido a que el corte se aplica después de reordenar. Esto ahora está prohibido, por ejemplo:
>>> Model.objects.all()[:2].reverse()
Traceback (most recent call last):
...
TypeError: Cannot reverse a query once a slice has been taken.
Para ayudar a prevenir errores en tiempo de ejecución debido al orden incorrecto de los argumentos de campo de formulario, los argumentos opcionales de los campos de formulario integrados ya no se aceptan como argumentos posicionales. Por ejemplo:
forms.IntegerField(25, 10)
produce una excepción y debe reemplazarse con:
forms.IntegerField(max_value=25, min_value=10)
call_command() valida las opciones que recibe¶call_command() ahora valida que el analizador de argumentos del comando que se está llamando defina todas las opciones pasadas a call_command().
Para comandos de gestión personalizados que utilizan opciones no creadas utilizando parser.add_argument(), agrega un atributo stealth_options en el comando:
class MyCommand(BaseCommand):
stealth_options = ("option_name", ...)
Por ejemplo:
models.Index(["headline", "-pub_date"], "index_name")
produce una excepción y debe reemplazarse con:
models.Index(fields=["headline", "-pub_date"], name="index_name")
Esto aparecerá como una modificación incompatible con la versión anterior (IntegrityError: FOREIGN KEY constraint failed) si se intenta guardar una instancia de modelo existente que está violando una restricción de clave foránea.
Las claves foráneas ahora se crean con DEFERRABLE INITIALLY DEFERRED en lugar de DEFERRABLE IMMEDIATE. Por lo tanto, las tablas pueden necesitar ser reconstruidas para recrear las claves foráneas con la nueva definición, especialmente si estás utilizando un patrón como este:
from django.db import transaction
with transaction.atomic():
Book.objects.create(author_id=1)
Author.objects.create(id=1)
Si no recreas la clave foránea como DEFERRED, el primer create() fallaría ahora que las restricciones de claves foráneas están habilitadas.
Primero haz una copia de seguridad de tu base de datos. Después de actualizar a Django 2.0, puedes reconstruir las tablas utilizando un script similar a este:
from django.apps import apps
from django.db import connection
for app in apps.get_app_configs():
for model in app.get_models(include_auto_created=True):
if model._meta.managed and not (model._meta.proxy or model._meta.swapped):
for base in model.__bases__:
if hasattr(base, "_meta"):
base._meta.local_many_to_many = []
model._meta.local_many_to_many = []
with connection.schema_editor() as editor:
editor._remake_table(model)
Este script no ha recibido pruebas exhaustivas y necesita adaptarse para casos variados como bases de datos múltiples. No dudes en contribuir mejoras.
Además, debido a la limitación de alteración de tablas de SQLite, está prohibido realizar operaciones RenameModel y RenameField sobre modelos o campos referenciados por otros modelos en una transacción. Para permitir que las migraciones contengan estas operaciones se apliquen, debes establecer el atributo Migration.atomic en False.
La clase SessionAuthenticationMiddleware ha sido eliminada. No proporcionaba ninguna funcionalidad ya que la autenticación de sesión está habilitada condicionalmente en Django 1.10.
Los maneadores de errores HTTP por defecto (handler404, etc.) ahora son llamables en lugar de cadenas de ruta Python punteadas. Django prefiere referencias llamables ya que proporcionan una mejor experiencia de rendimiento y depuración.
RedirectView ya no silencia NoReverseMatch si el pattern_name no existe.
Cuando USE_L10N está deshabilitado, FloatField y DecimalField ahora respetan DECIMAL_SEPARATOR y THOUSAND_SEPARATOR durante la validación. Por ejemplo, con las configuraciones:
USE_L10N = False
USE_THOUSAND_SEPARATOR = True
DECIMAL_SEPARATOR = ","
THOUSAND_SEPARATOR = "."
una entrada de "1.345" se convierte ahora en 1345 en lugar de 1.345.
Las clases que heredan de AbstractBaseUser ya no requieren implementar get_short_name() y get_full_name(). (Las implementaciones base que levantan NotImplementedError han sido eliminadas.) django.contrib.admin utiliza estos métodos si están implementados pero no los requiere. Las aplicaciones de terceros que utilizan estos métodos pueden querer adoptar un enfoque similar.
Los formatos de fecha y agrupación numérica ahora se mantienen como enteros en los outputs JavaScript e i18n JSON.
Ahora assertNumQueries() ignora las consultas de configuración de conexión. Anteriormente, si un test abría una nueva conexión a la base de datos, esas consultas podían ser incluidas en el recuento de assertNumQueries().
La tamaño por defecto del espacio de la tabla de pruebas Oracle se ha aumentado de 20M a 50M y el tamaño automático de extensión se ha aumentado de 10M a 25M.
Para mejorar el rendimiento al obtener conjuntos de resultados grandes desde la base de datos, QuerySet.iterator() ahora obtiene 2000 filas a la vez en lugar de 100. El comportamiento antiguo se puede restaurar utilizando el parámetro chunk_size. Por ejemplo:
Book.objects.iterator(chunk_size=100)
Ahora proporcionar nombres de paquetes desconocidos en el argumento packages de la vista JavaScriptCatalog levanta una excepción ValueError en lugar de pasar silenciosamente.
El identificador primario de un modelo ahora aparece en el método Model.__str__() por defecto, p. ej. Question object (1).
Ahora makemigrations detecta cambios en la opción del campo de modelo limit_choices_to. Agrega esto a tus migraciones existentes o acepta una migración generada automáticamente para campos que lo utilizan.
Ahora levanta una excepción NotImplementedError en MySQL al realizar consultas que requieren transformaciones espaciales automáticas en lugar de utilizar silenciosamente geometrías no transformadas.
Se ha eliminado django.core.exceptions.DjangoRuntimeWarning. Solo se utilizaba en el backend de caché como una clase intermedia en la herencia de CacheKeyWarning de RuntimeWarning.
Renombrado BaseExpression._output_field a output_field. Puede que debas actualizar expresiones personalizadas.
Los textos traducidos son:
Se ha eliminado django.contrib.gis.gdal.OGRException. Ha sido un alias para GDALException desde Django 1.8.
Se ha abandonado el soporte para GEOS 3.3.x.
La forma en que se selecciona los datos para GeometryField se cambia para mejorar el rendimiento, y en consultas SQL crudas, esos campos deben estar ahora envueltos en connection.ops.select. Consulte la nota sobre consultas SQL crudas <gis-raw-sql> en el tutorial de GIS para un ejemplo.
context de Field.from_db_value() y Expression.convert_value()¶El argumento context de Field.from_db_value() y Expression.convert_value() es innecesario ya que siempre es un diccionario vacío. La firma de ambos métodos ahora es:
(self, value, expression, connection)
en lugar de:
(self, value, expression, connection, context)
Se mantiene el soporte para la antigua firma en campos y expresiones personalizados hasta Django 3.0.
El módulo django.db.backends.postgresql_psycopg2 está obsoleto a favor de django.db.backends.postgresql. Ha sido un alias desde Django 1.9. Esto solo afecta al código que importe directamente del módulo. La configuración DATABASES puede seguir utilizando 'django.db.backends.postgresql_psycopg2', aunque se puede simplificar utilizando el nombre 'django.db.backends.postgresql' agregado en Django 1.9.
django.shortcuts.render_to_response() está obsoleto a favor de django.shortcuts.render(). render() requiere los mismos argumentos excepto que también requiere un request.
La traducción de los textos es la siguiente:
HttpRequest.xreadlines() está descontinuado en favor de iterar sobre la solicitud.
El parámetro field_name del argumento keyword para QuerySet.earliest() y QuerySet.latest() está descontinuado a favor de pasar los nombres de campo como argumentos. Escribe .earliest('pub_date') en lugar de .earliest(field_name='pub_date').
Estas características han llegado al final de su ciclo de descontinuación y se eliminan en Django 2.0.
Consulte Características obsoletas en 1.9 para obtener detalles sobre estas modificaciones, incluyendo cómo eliminar el uso de estas características.
El argumento weak a django.dispatch.signals.Signal.disconnect() se ha eliminado.
django.db.backends.base.BaseDatabaseOperations.check_aggregate_support() se ha eliminado.
La paqueta django.forms.extras se ha eliminado.
El asistente de ayuda assignment_tag se ha eliminado.
El argumento host de SimpleTestCase.assertsRedirects() se ha eliminado. También se ha eliminado la capa de compatibilidad que permite considerar URLs absolutas iguales a las relativas cuando el camino es idéntico.
Se han eliminado Field.rel y Field.remote_field.to.
El argumento on_delete para ForeignKey y OneToOneField ahora es obligatorio en modelos y migraciones. Considera fusionar las migraciones para que tengas menos de ellas que actualizar.
Se ha eliminado django.db.models.fields.add_lazy_relation().
Cuando se habilita el soporte de zona horaria, los backends de bases de datos que no admiten zonas horarias ya no convierten fechas conscientes a valores ingenuos en UTC cuando tales valores se pasan como parámetros a consultas SQL ejecutadas fuera del ORM, por ejemplo con cursor.execute().
Se ha eliminado django.contrib.auth.tests.utils.skipIfCustomUser().
Las clases GeoManager y GeoQuerySet se han eliminado.
El módulo django.contrib.gis.geoip se ha eliminado.
La comprobación de supports_recursion para cargadores de plantillas se ha eliminado de:
django.template.engine.Engine.find_template()
La traducción de los textos es la siguiente:
django.template.loaders.base.Loader.supports_recursion()
django.template.loaders.cached.Loader.supports_recursion()
Se han eliminado los métodos de carga de plantillas load_template y load_template_sources.
Se ha eliminado el argumento template_dirs para los cargadores de plantillas:
django.template.loaders.base.Loader.get_template()
django.template.loaders.cached.Loader.cache_key()
django.template.loaders.cached.Loader.get_template()
django.template.loaders.cached.Loader.get_template_sources()
django.template.loaders.filesystem.Loader.get_template_sources()
django.template.loaders.base.Loader.__call__() se ha eliminado.
Se ha eliminado el soporte para vistas de errores personalizadas que no aceptan un parámetro exception.
Se ha eliminado la atributo mime_type de django.utils.feedgenerator.Atom1Feed y django.utils.feedgenerator.RssFeed.
Se ha eliminado el argumento app_name a include().
Se ha eliminado el soporte para pasar una tupla de 3 elementos (incluyendo admin.site.urls) como primer argumento a include().
Se ha eliminado el soporte para establecer un espacio de nombres de URL sin un espacio de nombres de aplicación.
Se ha eliminado Field._get_val_from_obj().
Se ha eliminado django.template.loaders.eggs.Loader.
Se ha eliminado el parámetro current_app a las vistas basadas en funciones de contrib.auth.
Se ha eliminado la palabra clave argumento callable_obj a SimpleTestCase.assertRaisesMessage().
Soporte para la característica allow_tags en métodos de ModelAdmin se ha eliminado.
La traducción es:
La traducción es:
Ver la documentación sobre estas modificaciones en Características deprecadas en 1.10.
La opción makemigrations --exit se ha eliminado.
Eliminada la compatibilidad con la asignación directa a una clave de campo foránea o relación muchos-a-muchos.
La traducción es:
Los métodos get_x(), set_x(), get_y(), set_y(), get_z(), y set_z() de django.contrib.gis.geos.Point se eliminan.
Los métodos get_coords() y set_coords() de django.contrib.gis.geos.Point han sido eliminados.
La propiedad cascaded_union de django.contrib.gis.geos.MultiPolygon se ha eliminado.
django.utils.functional.allow_lazy() se ha eliminado.
La opción shell --plain se ha eliminado.
El módulo django.core.urlresolvers se ha eliminado en favor de su nueva ubicación, django.urls.
Se ha eliminado el campo CommaSeparatedIntegerField, excepto por el soporte en migraciones históricas.
Se ha eliminado el método del template Context.has_key().
Se ha eliminado el soporte para los métodos de almacenamiento de archivos django.core.files.storage.Storage.accessed_time(), created_time(), y modified_time().
Se ha eliminado el soporte para consultas de búsqueda utilizando el nombre del modelo cuando se establece Meta.default_related_name.
La consulta de búsqueda MySQL __search se ha eliminado.
Se ha eliminado la capa de compatibilidad para admitir clases personalizadas de administradores relacionados sin un método _apply_rel_filters().
Ya no se admite el uso de User.is_authenticated() y User.is_anonymous() como métodos en lugar de propiedades.
El atributo Model._meta.virtual_fields se ha eliminado.
Se han eliminado los argumentos de palabra clave virtual_only en Field.contribute_to_class() y virtual en Model._meta.add_field().
Las vistas javascript_catalog() y json_catalog() se han eliminado.
Se ha eliminado la función django.contrib.gis.utils.precision_wkt().
La promoción implícita de un campo OneToOneField a un parent_link en herencia múltiple se ha eliminado.
El soporte para Widget._format_value() se ha eliminado.
Se han eliminado los métodos get_directory_name() y get_filename() de FileField.
La función mark_for_escaping() y las clases que utiliza: EscapeData, EscapeBytes, EscapeText, EscapeString y EscapeUnicode se han eliminado.
El filtro escape ahora utiliza django.utils.html.conditional_escape().
Se ha eliminado Manager.use_for_related_fields.
La traducción de los textos es la siguiente:
Se ha eliminado el soporte para middleware antiguos utilizando settings.MIDDLEWARE_CLASSES.
may 31, 2026