Django 2.2 versionsinformation¶
1 april 2019
Välkommen till Django 2.2!
Dessa versionsinformation 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.
Kompatibilitet med Python¶
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.
Vad är nytt i Django 2.2¶
Begränsningar¶
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.
Mindre funktioner¶
django.contrib.admin¶
Lade till en CSS-klass till kolumnrubrikerna i
TabularInline.
django.contrib.auth¶
HttpRequestskickas nu som det första positionella argumentet tillRemoteUserBackend.configure_user(), om det accepteras.
django.contrib.gis¶
django.contrib.postgres¶
Det nya argumentet
orderingförArrayAggochStringAggbestämmer ordningen på de aggregerade elementen.De nya klasserna
BTreeIndex,HashIndexochSpGistIndexgör det möjligt att skapaB-Tree,hashochSP-GiSTindex i databasen.BrinIndexhar nu parameternautosummarize.Den nya parametern
search_typeiSearchQuerygö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/*.jskan användas.
Databas backends¶
Lagt till resultatströmning för
QuerySet.iterator()på SQLite.
Generiska åsikter¶
Den nya
View.setup-hook initialiserar vyattribut innan den anropardispatch(). Det gör det möjligt för mixins att ställa in instansattribut för återanvändning i underordnade klasser.
Internationalisering¶
Stöd och översättningar för armeniska har lagts till.
Kommandon för hantering¶
Det nya alternativet
--force-colortvingar fram färgläggning av kommandoutmatningen.inspectdbskapar nu modeller för utländska tabeller på PostgreSQL.inspectdb --include-viewsskapar 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.
inspectdbintrospekterar nuDurationFieldför Oracle och PostgreSQL, ochAutoFieldför SQLite.På Oracle paketeras
dbshellmedrlwrap, om det finns tillgängligt.rlwrapger en kommandohistorik och redigering av tangentbordsinmatning.Det nya alternativet
makemigrations --no-headerundviker att skriva huvudkommentarer i genererade migreringsfiler. Detta alternativ är också tillgängligt försquashmigrations.runserverkan nu använda Watchman för att förbättra prestandan vid bevakning av ett stort antal filer med avseende på ändringar.
Migreringar¶
Det nya alternativet
migrate --planskriver ut en lista över de migreringsåtgärder som ska utföras.NoneTypekan nu serialiseras i migreringar.Du kan nu registrera anpassade serializers för migreringar.
Modeller¶
Lagt till stöd för PostgreSQL-operatörsklasser (
Index.opclasses).Lagt till stöd för partiella index (
Index.condition).Lagt till databasfunktionerna
NullIfochReverse, samt många math databasfunktioner.Genom att ställa in den nya parametern
ignore_conflictsiQuerySet.bulk_create()tillTruefår databasen veta att den ska ignorera misslyckanden med att infoga rader som inte uppfyller unikhetsbegränsningar eller andra kontroller.Den nya funktionen
ExtractIsoYearextraherar ISO-8601 veckonummererade år frånDateFieldochDateTimeField, och den nyaiso_yeargö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()ochModel.delete(). Detta förbättrar prestandan för autocommit genom att minska antalet rundresor i databasen.Hanteringen av
DISTINCT-aggregering läggs till i klassenAggregate`. Genom att lägga tillallow_distinct = Truesom ett klassattribut påAggregatesubklasser kan ettdistinctnyckelordsargument anges vid initialisering för att säkerställa att aggregatfunktionen endast anropas för varje distinkt värde avexpressions.Metoderna
RelatedManager.add(),create(),remove(),set(),get_or_create()ochupdate_or_create()är nu tillåtna för många-till-många-relationer med mellanliggande modeller. Det nya argumentetthrough_defaultsanvänds för att ange värden för nya mellanliggande modellinstanser.
Förfrågningar och svar¶
Lagt till
HttpRequest.headersför att ge enkel åtkomst till en requests headers.
Serialisering¶
Du kan nu deserialisera data med hjälp av naturliga nycklar som innehåller forward references genom att skicka
handle_forward_references=Truetillserializers.deserialize(). Dessutom hanterarloaddataframåtriktade referenser automatiskt.
Tester¶
Det nya
SimpleTestCase.assertURLEqual()-testet kontrollerar en given URL och ignorerar ordningsföljden på frågesträngen.assertRedirects()använder det nya testet.Test
Clienthar nu stöd för automatisk JSON-serialisering av list- och tuple-data närcontent_type='application/json'.Den nya
ORACLE_MANAGED_FILEStestdatabasinstä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.DiscoverRunnerhoppar nu över installationen av databaser som inte refereras av tester.
URL:er¶
Det nya attributet
ResolverMatch.routelagrar rutten för det matchande URL-mönstret.
Validerare¶
MaxValueValidator,MinValueValidator,MinLengthValidatorochMaxLengthValidatoraccepterar nu en anropbarlimit_value.
Bakåtkompatibla ändringar i 2.2¶
Databas backend API¶
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_constraintstillFalse.Tredjeparts databasbackends måste implementera stöd för att ignorera begränsningar eller unikhetsfel vid infogning eller ställa in
DatabaseFeatures.supports_ignore_conflictstillFalse.Tredjeparts databasbackends måste implementera introspektion för
DurationFieldeller sättaDatabaseFeatures.can_introspect_duration_fieldtillFalse.DatabaseFeatures.uses_savepointshar nu standardvärdetTrue.Tredjeparts databasbackends måste implementera stöd för partiella index eller sätta
DatabaseFeatures.supports_partial_indexestillFalse.DatabaseIntrospection.table_name_converter()ochcolumn_name_converter()tas bort. Tredjeparts databasbackends kan istället behöva implementeraDatabaseIntrospection.identifier_converter(). I så fall måste de begränsningsnamn somDatabaseIntrospection.get_constraints()returnerar normaliseras medidentifier_converter().SQL-generering för index flyttas från
IndextillSchemaEditoroch dessaSchemaEditor-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.
Admin-åtgärder samlas inte längre in från basklasserna 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.
alias för 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"))
Behörigheter för proxymodeller¶
Rättigheter för proxymodeller 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').
Sammanslagning av tillgångar i form av 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.
Diverse¶
För att förbättra läsbarheten visar formfältet
UUIDFieldnu värden med bindestreck, t.ex.550e8400-e29b-41d4-a716-446655440000istället för550e8400e29b41d4a716446655440000.I SQLite innehåller
PositiveIntegerFieldochPositiveSmallIntegerFieldnu 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 seCHECK constraint failed.För att vara konsekvent med WSGI-servrar sätter testklienten nu rubriken
Content-Lengthtill 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,truncatewordsochtruncatewords_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, ochdjango.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
mysqlclientsom 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
NullBooleanSelectnu<option>värdenaunknown,trueochfalseistället för1,2och3. 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
Clientochdjango.utils.http.urlencode()nu upphov tillTypeErroromNoneskickas som ett värde att koda eftersomNoneinte kan kodas i GET- och POST-data. Antingen skicka en tom sträng eller utelämna värdet.Hanteringskommandot
ping_googleanvänder nu som standardhttpsi stället förhttpför webbplatskartans URL. Om din webbplats använder http, använd det nya alternativetping_google --sitemap-uses-http. Om du använder funktionendjango.contrib.sitemaps.ping_google, sätt det nya argumentetsitemap_uses_httpstillFalse.runserverhar inte längre stöd förpyinotify(ersatt av Watchman).Aggregatfunktionerna
Avg,StdDevochVariancereturnerar nu enDecimalistället för enfloatnär indata ärDecimal.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 icache.delete()ellercache.get()uppstår nuValueError.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.
Funktioner som inte längre är aktuella i 2.2¶
Modellen 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.
Diverse¶
django.utils.timezone.FixedOffsetär föråldrad till förmån fördatetime.timezone.Det odokumenterade aliaset
QuerySetPaginatorfördjango.core.paginator.Paginatorär föråldrat.Modell- och formulärfälten
FloatRangeFieldidjango.contrib.postgresär utdaterade till förmån för ett nytt namn,DecimalRangeField, för att matcha den underliggande datatypennumrangesom 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ändManifestStaticFilesStorageeller en molnlagring från tredje part istället.RemoteUserBackend.configure_user()skickas nurequestsom 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_dbochTestCase.multi_dbär föråldrade till förmån förSimpleTestCase.databases,TransactionTestCase.databasesochTestCase.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 medallow_database_queries=Trueochmulti_db=Truekan uppnås genom att ställa indatabases='__all__'.