1 april 2019
Välkommen till Django 2.2!
Dessa release notes täcker nya funktioner, samt några bakåtkompatibla förändringar som du vill vara medveten om när du uppgraderar från Django 2.1 eller tidigare. Vi har börjat utfasningsprocessen för vissa funktioner.
Se guiden Så här uppgraderar du Django till en nyare version om du ska uppdatera ett befintligt projekt.
Django 2.2 betecknas som en long-term support release. Den kommer att få säkerhetsuppdateringar i minst tre år efter att den släppts. Stöd för den tidigare LTS, Django 1.11, kommer att upphöra i april 2020.
Django 2.2 stöder Python 3.5, 3.6, 3.7, 3.8 (från och med 2.2.8) och 3.9 (från och med 2.2.17). Vi rekommenderar starkt och stöder endast officiellt den senaste utgåvan av varje serie.
De nya klasserna CheckConstraint och UniqueConstraint gör det möjligt att lägga till anpassade databasbegränsningar. Begränsningar läggs till i modeller med hjälp av alternativet Meta.constraints.
django.contrib.admin¶Lade till en CSS-klass till kolumnrubrikerna i TabularInline.
django.contrib.auth¶HttpRequest skickas nu som det första positionella argumentet till RemoteUserBackend.configure_user(), om det accepteras.
django.contrib.gis¶django.contrib.postgres¶Det nya argumentet ordering för ArrayAgg och StringAgg bestämmer ordningen på de aggregerade elementen.
De nya klasserna BTreeIndex, HashIndex och SpGistIndex gör det möjligt att skapa B-Tree, hash och SP-GiST index i databasen.
BrinIndex har nu parametern autosummarize.
Den nya parametern search_type i SearchQuery gör det möjligt att söka efter en fras eller ett rått uttryck.
django.contrib.staticfiles¶Lagt till sökvägsmatchning till collectstatic --ignore-alternativet så att mönster som /vendor/*.js kan användas.
Lagt till resultatströmning för QuerySet.iterator() på SQLite.
Den nya View.setup-kroken initialiserar vyattribut innan den anropar dispatch(). Det gör det möjligt för mixins att ställa in instansattribut för återanvändning i underordnade klasser.
Stöd och översättningar för armeniska har lagts till.
Det nya alternativet --force-color tvingar fram färgläggning av kommandoutmatningen.
inspectdb skapar nu modeller för utländska tabeller på PostgreSQL.
inspectdb --include-views skapar nu modeller för materialiserade vyer på Oracle och PostgreSQL.
Det nya alternativet: inspectdb –include-partitions-alternativet gör det möjligt att skapa modeller för partitionstabeller på PostgreSQL. I äldre versioner skapas modeller barntabeller istället för föräldern.
inspectdb introspekterar nu DurationField för Oracle och PostgreSQL, och AutoField för SQLite.
På Oracle paketeras dbshell med rlwrap, om det finns tillgängligt. rlwrap ger en kommandohistorik och redigering av tangentbordsinmatning.
Det nya alternativet makemigrations --no-header undviker att skriva huvudkommentarer i genererade migreringsfiler. Detta alternativ är också tillgängligt för squashmigrations.
runserver kan nu använda Watchman för att förbättra prestandan vid bevakning av ett stort antal filer med avseende på ändringar.
Det nya alternativet migrate --plan skriver ut en lista över de migreringsåtgärder som ska utföras.
NoneType kan nu serialiseras i migreringar.
Du kan nu registrera anpassade serializers för migreringar.
Lagt till stöd för PostgreSQL-operatörsklasser (Index.opclasses).
Lagt till stöd för partiella index (Index.condition).
Lagt till databasfunktionerna NullIf och Reverse, samt många math databasfunktioner.
Genom att ställa in den nya parametern ignore_conflicts i QuerySet.bulk_create() till True får databasen veta att den ska ignorera misslyckanden med att infoga rader som inte uppfyller unikhetsbegränsningar eller andra kontroller.
Den nya funktionen ExtractIsoYear extraherar ISO-8601 veckonummererade år från DateField och DateTimeField, och den nya iso_year gör det möjligt att ställa frågor om ett ISO-8601 veckonummererat år.
Den nya metoden QuerySet.bulk_update() gör det möjligt att effektivt uppdatera specifika fält i flera modellinstanser.
Django startar inte längre alltid en transaktion när en enda fråga utförs, till exempel Model.save(), QuerySet.update() och Model.delete(). Detta förbättrar prestandan för autocommit genom att minska antalet rundresor i databasen.
Hanteringen av DISTINCT-aggregering läggs till i klassen Aggregate`. Genom att lägga till allow_distinct = True som ett klassattribut på Aggregate subklasser kan ett distinct nyckelordsargument anges vid initialisering för att säkerställa att aggregatfunktionen endast anropas för varje distinkt värde av expressions.
Metoderna RelatedManager.add(), create(), remove(), set(), get_or_create() och update_or_create() är nu tillåtna för många-till-många-relationer med mellanliggande modeller. Det nya argumentet through_defaults används för att ange värden för nya mellanliggande modellinstanser.
Lagt till HttpRequest.headers för att ge enkel åtkomst till en requests headers.
Du kan nu deserialisera data med hjälp av naturliga nycklar som innehåller forward references genom att skicka handle_forward_references=True till serializers.deserialize(). Dessutom hanterar loaddata framåtriktade referenser automatiskt.
Det nya SimpleTestCase.assertURLEqual()-testet kontrollerar en given URL och ignorerar ordningsföljden på frågesträngen. assertRedirects() använder det nya testet.
Test Client har nu stöd för automatisk JSON-serialisering av list- och tuple-data när content_type='application/json'.
Den nya :inställningen:`ORACLE_MANAGED_FILES <TEST_ORACLE_MANAGED_FILES>` testdatabasinställning tillåter användning av Oracle Managed Files (OMF) tablespaces.
Deferrable database constraints kontrolleras nu i slutet av varje TestCase-test på SQLite 3.20+, precis som på andra backends som stöder deferrable constraints. Dessa kontroller är inte implementerade för äldre versioner av SQLite eftersom de skulle kräva dyr tabellintrospektion där.
DiscoverRunner hoppar nu över installationen av databaser som inte refereras av tester.
Det nya attributet ResolverMatch.route lagrar rutten för det matchande URL-mönstret.
MaxValueValidator, MinValueValidator, MinLengthValidator och MaxLengthValidator accepterar nu en anropbar limit_value.
I det här avsnittet beskrivs ändringar som kan behövas i tredjeparts databasbackends.
Tredjeparts databasbackends måste implementera stöd för tabellkontrollbegränsningar eller sätta DatabaseFeatures.supports_table_check_constraints till False.
Tredjeparts databasbackends måste implementera stöd för att ignorera begränsningar eller unikhetsfel vid infogning eller ställa in DatabaseFeatures.supports_ignore_conflicts till False.
Tredjeparts databasbackends måste implementera introspektion för DurationField eller sätta DatabaseFeatures.can_introspect_duration_field till False.
DatabaseFeatures.uses_savepoints har nu standardvärdet True.
Tredjeparts databasbackends måste implementera stöd för partiella index eller sätta DatabaseFeatures.supports_partial_indexes till False.
DatabaseIntrospection.table_name_converter() och column_name_converter() tas bort. Tredjeparts databasbackends kan istället behöva implementera DatabaseIntrospection.identifier_converter(). I så fall måste de begränsningsnamn som DatabaseIntrospection.get_constraints() returnerar normaliseras med identifier_converter().
SQL-generering för index flyttas från Index till SchemaEditor och dessa SchemaEditor-metoder läggs till:
_create_primary_key_sql() och _delete_primary_key_sql()
_delete_index_sql() (att para ihop med _create_index_sql())
_delete_unique_sql (att para ihop med _create_unique_sql()))
_delete_fk_sql() (att para ihop med _create_fk_sql())
_create_check_sql() och _delete_check_sql()
Det tredje argumentet i DatabaseWrapper.__init__(), allow_thread_sharing, har tagits bort.
ModelAdmin¶Till exempel i äldre versioner av Django:
from django.contrib import admin
class BaseAdmin(admin.ModelAdmin):
actions = ["a"]
class SubAdmin(BaseAdmin):
actions = ["b"]
SubAdmin skulle ha åtgärderna 'a och 'b.
Nu följer actions standard Python-arv. För att få samma resultat som tidigare:
class SubAdmin(BaseAdmin):
actions = BaseAdmin.actions + ["b"]
django.contrib.gis¶Stöd för GDAL 1.9 och 1.10 har tagits bort.
TransactionTestCase laddning av serialiserad data¶Initiala datamigreringar laddas nu i TransactionTestCase i slutet av testet, efter databasspolningen. I äldre versioner laddades dessa data i början av testet, men detta förhindrar att alternativet test --keepdb fungerar korrekt (databasen var tom i slutet av hela testsviten). Denna ändring bör inte ha någon inverkan på dina tester om du inte har anpassat TransactionTestCase:s interna funktioner.
`sqlparse är ett nödvändigt beroende¶För att förenkla några delar av Djangos databashantering är sqlparse 0.2.2+ nu ett obligatoriskt beroende. Det installeras automatiskt tillsammans med Django.
cached_property¶I användning som:
from django.utils.functional import cached_property
class A:
@cached_property
def base(self):
return ...
alias = base
alias cachelagras inte. Där problemet kan upptäckas (Python 3.6 och senare), ger sådan användning nu upphov till ``TypeError: Det går inte att tilldela samma cached_property till två olika namn (’base’ och ’alias’)
Använd detta istället:
import operator
class A:
...
alias = property(operator.attrgetter("base"))
:ref:``Rättigheter för proxymodeller <proxy-models-permissions-topic>` skapas nu med hjälp av proxymodellens innehållstyp i stället för den konkreta modellens innehållstyp. En migrering kommer att uppdatera befintliga behörigheter när du kör migrate.
I admin är ändringen transparent för proxymodeller som har samma app_label som sin konkreta modell. I äldre versioner kunde dock användare med behörigheter för en proxymodell med en annan app_label än dess konkreta modell inte komma åt modellen i admin. Det är nu åtgärdat, men du kanske vill granska behörighetstilldelningarna för sådana proxymodeller ([add|view|change|delete]_myproxy) innan du uppgraderar för att säkerställa att den nya åtkomsten är lämplig.
Slutligen måste proxymodellens behörighetssträngar uppdateras så att de använder sin egen app_label. Till exempel, för app.MyProxyModel som ärver från other_app.ConcreteModel, uppdatera user.has_perm('other_app.add_myproxymodel') till user.has_perm('app.add_myproxymodel').
Media¶Tillgångar i formuläret Media slås nu samman med hjälp av en topologisk sorteringsalgoritm, eftersom den gamla parvisa sammanslagningsalgoritmen är otillräcklig i vissa fall. CSS- och JavaScript-filer som inte inkluderar sina beroenden kan nu sorteras felaktigt (där den gamla algoritmen av en slump gav korrekta resultat).
Granska alla Media-klasser för eventuella saknade beroenden. Till exempel måste widgetar som är beroende av django.jQuery ange js=['admin/js/jquery.init.js', ...] när declaring form media assets.
För att förbättra läsbarheten visar formfältet UUIDField nu värden med bindestreck, t.ex. 550e8400-e29b-41d4-a716-446655440000 istället för 550e8400e29b41d4a716446655440000.
I SQLite innehåller PositiveIntegerField och PositiveSmallIntegerField nu en check constraint för att förhindra negativa värden i databasen. Om du har befintliga ogiltiga data och kör en migrering som återskapar en tabell, kommer du att se CHECK constraint failed.
För att vara konsekvent med WSGI-servrar sätter testklienten nu rubriken Content-Length till en sträng istället för ett heltal.
Returvärdet för django.utils.text.slugify() är inte längre markerat som HTML-säkert.
Det förvalda trunkeringstecknet som används av mallfiltren urlizetrunc, truncatechars, truncatechars_html, truncatewords och truncatewords_html är nu det riktiga ellipstecknet (...) istället för 3 punkter. Du kan behöva anpassa vissa jämförelser av testutdata.
Stöd för bytestringssökvägar i mallfilsystemladdaren har tagits bort.
django.utils.http.urlsafe_base64_encode() returnerar nu en sträng istället för en bytestring, och django.utils.http.urlsafe_base64_decode() kan inte längre skickas en bytestring.
Stöd för cx_Oracle < 6.0 har tagits bort.
Den minsta versionen av mysqlclient som stöds har ökats från 1.3.7 till 1.3.13.
Den lägsta versionen av SQLite som stöds har ökats från 3.7.15 till 3.8.3.
I ett försök att tillhandahålla mer semantiska frågedata återger NullBooleanSelect nu <option> värdena unknown, true och false istället för 1, 2 och 3. För bakåtkompatibilitet accepteras fortfarande de gamla värdena som data.
Group.name <django.contrib.auth.models.Group.name>` max_length ökas från 80 till 150 tecken.
Tester som bryter mot deferrable databasbegränsningar misslyckas nu när de körs på SQLite 3.20+, precis som på andra backends som stöder sådana begränsningar.
För att fånga upp användningsmisstag ger testet Client och django.utils.http.urlencode() nu upphov till TypeError om None skickas som ett värde att koda eftersom None inte kan kodas i GET- och POST-data. Antingen skicka en tom sträng eller utelämna värdet.
Hanteringskommandot ping_google använder nu som standard https i stället för http för webbplatskartans URL. Om din webbplats använder http, använd det nya alternativet ping_google --sitemap-uses-http. Om du använder funktionen django.contrib.sitemaps.ping_google, sätt det nya argumentet sitemap_uses_https till False.
runserver har inte längre stöd för pyinotify (ersatt av Watchman).
Aggregatfunktionerna Avg, StdDev och Variance returnerar nu en Decimal istället för en float när indata är Decimal.
Tester kommer att misslyckas på SQLite om appar utan migreringar har relationer till appar med migreringar. Detta har varit en dokumenterad begränsning sedan migreringar lades till i Django 1.7, men det misslyckas mer tillförlitligt nu. Du kommer att se tester som misslyckas med fel som ingen sådan tabell: <app_label>_<model>. Detta observerades med flera tredjepartsappar som hade modeller i tester utan migreringar. Du måste lägga till migreringar för sådana modeller.
Om ett heltal anges i key-argumentet i cache.delete() eller cache.get() uppstår nu ValueError.
Pluralekvationer för vissa språk har ändrats eftersom de senaste versionerna från Transifex har införts.
Observera
Möjligheten att hantera .po-filer som innehåller olika pluralekvationer för samma språk har lagts till i Django 2.2.12.
Meta.ordering påverkar inte längre GROUP BY-frågor¶En modells Meta.ordering som påverkar GROUP BY-frågor (t.ex. .annotate().values()) är en vanlig källa till förvirring. Sådana frågor ger nu en deprecation-varning med rådet att lägga till en order_by() för att behålla den aktuella frågan. Meta.ordering kommer att ignoreras i sådana frågor med start i Django 3.1.
django.utils.timezone.FixedOffset är föråldrad till förmån för datetime.timezone.
Det odokumenterade aliaset QuerySetPaginator för django.core.paginator.Paginator är föråldrat.
Modell- och formulärfälten FloatRangeField i django.contrib.postgres är utdaterade till förmån för ett nytt namn, DecimalRangeField, för att matcha den underliggande datatypen numrange som används i databasen.
Inställningen FILE_CHARSET är föråldrad. Från och med Django 3.1 måste filer som läses från disk vara UTF-8-kodade.
django.contrib.staticfiles.storage.CachedStaticFilesStorage är föråldrad på grund av de olösliga problem som den har. Använd ManifestStaticFilesStorage eller en molnlagring från tredje part istället.
RemoteUserBackend.configure_user() skickas nu request som det första positionella argumentet, om det accepterar det. Stöd för åsidosättningar som inte accepterar det kommer att tas bort i Django 3.1.
Attributen SimpleTestCase.allow_database_queries, TransactionTestCase.multi_db och TestCase.multi_db är föråldrade till förmån för SimpleTestCase.databases, TransactionTestCase.databases och TestCase.databases. Dessa nya attribut gör det möjligt att deklarera databasberoenden för att förhindra att oväntade frågor mot databaser som inte är standarddatabaser läcker tillstånd mellan tester. Det tidigare beteendet med allow_database_queries=True och multi_db=True kan uppnås genom att ställa in databases='__all__'.
aug. 11, 2025