Django 3.0 versionsinformation¶
2 december 2019
Välkommen till Django 3.0!
Dessa versionsinformation täcker nya funktioner, samt några bakåtkompatibla ändringar som du vill vara medveten om när du uppgraderar från Django 2.2 eller tidigare. Vi har ta bort några funktioner som har nått slutet av sin utfasningscykel, och vi har startat utfasningsprocessen för några funktioner.
Se guiden Så här uppgraderar du Django till en nyare version om du ska uppdatera ett befintligt projekt.
Kompatibilitet med Python¶
Django 3.0 stöder Python 3.6, 3.7, 3.8 och 3.9 (från och med 3.0.11). Vi rekommenderar starkt och stöder endast officiellt den senaste versionen av varje serie.
Django 2.2.x-serien är den sista som stöder Python 3.5.
Stöd för tredjepartsbibliotek för äldre versioner av Django¶
Efter lanseringen av Django 3.0 föreslår vi att tredjepartsappförfattare släpper stödet för alla versioner av Django före 2.2. Vid den tidpunkten bör du kunna köra ditt pakets tester med python -Wd så att varningar för avskrivning visas. Efter att du har åtgärdat varningarna bör din app vara kompatibel med Django 3.0.
Vad är nytt i Django 3.0¶
Stöd för MariaDB¶
Django har nu officiellt stöd för MariaDB 10.1 och senare. Se MariaDB notes för mer information.
ASGI-stöd¶
Django 3.0 börjar vår resa mot att göra Django helt asynk-kompatibelt genom att ge stöd för att köra som en ASGI-applikation.
Detta är i tillägg till vårt befintliga WSGI-stöd. Django har för avsikt att stödja båda under överskådlig framtid. Async-funktioner kommer dock endast att vara tillgängliga för applikationer som körs under ASGI.
I det här skedet gäller async-stödet endast för den yttre ASGI-applikationen. Internt förblir allting synkront. Asynkrona mellanprogram, vyer etc. stöds ännu inte. Du kan dock använda ASGI middleware runt Djangos applikation, vilket gör att du kan kombinera Django med andra ASGI-ramverk.
Det finns ingen anledning att byta ut dina applikationer om du inte vill börja experimentera med asynkron kod, men vi har dokumentation om att distribuera med ASGI om du vill lära dig mer.
Observera att som en bieffekt av denna ändring är Django nu medveten om asynkrona händelseslingor och kommer att blockera dig när du anropar kod som är markerad som ”async unsafe” - till exempel ORM-operationer - från ett asynkront sammanhang. Om du använde Django från asynkron kod tidigare kan detta utlösa om du gjorde det felaktigt. Om du ser ett SynchronousOnlyOperation-fel, undersök sedan din kod noggrant och flytta alla databasoperationer till att vara i en synkron undertråd.
Undantagsbegränsningar på PostgreSQL¶
Den nya ExclusionConstraint-klassen gör det möjligt att lägga till uteslutningsbegränsningar på PostgreSQL. Begränsningar läggs till i modeller med hjälp av alternativet Meta.constraints.
Filtrera uttryck¶
Uttryck som ger ut BooleanField kan nu användas direkt i QuerySet-filter, utan att först behöva annotera och sedan filtrera mot annoteringen.
Uppräkningar för val av modellfält¶
Anpassade uppräkningstyper TextChoices, IntegerChoices och Choices är nu tillgängliga som ett sätt att definiera Field.choices. typerna TextChoices och IntegerChoices finns för text- och heltalsfält. Klassen Choices gör det möjligt att definiera en kompatibel uppräkning för andra konkreta datatyper. Dessa anpassade uppräkningstyper stöder mänskligt läsbara etiketter som kan översättas och nås via en egenskap på uppräkningen eller dess medlemmar. Se Enumerationstyper för mer information och exempel.
Mindre funktioner¶
django.contrib.admin¶
Lagt till stöd för attributet
admin_order_fieldpå egenskaper iModelAdmin.list_display.Den nya metoden
ModelAdmin.get_inlines()gör det möjligt att ange inlines baserat på begäran eller modellinstansen.Select2-biblioteket har uppgraderats från version 4.0.3 till 4.0.7.
jQuery uppgraderas från version 3.3.1 till 3.4.1.
django.contrib.auth¶
Det nya attributet
reset_url_tokeniPasswordResetConfirmViewgör det möjligt att ange en token-parameter som visas som en komponent i URL:er för återställning av lösenord.Lagt till
BaseBackend-klassen för att underlätta anpassning av autentiseringsbackends.Added
get_user_permissions()method to mirror the existingget_group_permissions()method.Lagt till HTML-attributet
autocompletetill widgets för användarnamn, e-post och lösenordsfält idjango.contrib.auth.formsför bättre interaktion med lösenordshanterare i webbläsare.createsuperuseråtergår nu till miljövariabler för lösenord och obligatoriska fält, när ett motsvarande kommandoradsargument inte anges i icke-interaktivt läge.REQUIRED_FIELDSstöder nu :class:`~django.db.models.ManyToManyField`s.Den nya metoden
UserManager.with_perm()returnerar användare som har den angivna behörigheten.Standardantalet iterationer för PBKDF2-lösenordshashen ökas från 150 000 till 180 000.
django.contrib.gis¶
Tillät MySQL:s spatiala uppslagsfunktioner att arbeta med verkliga geometrier. Tidigare stöd var begränsat till avgränsande rutor.
Lade till
GeometryDistance-funktionen, som stöds av PostGIS.Lagt till stöd för enheten
furlongiDistance.Inställningen
GEOIP_PATHhar nu stöd förpathlib.Path.Klassen
GeoIP2accepterar nupathlib.Pathpath.
django.contrib.postgres¶
Den nya
RangeOperatorshjälper till att undvika typfel i SQL-operatorer som kan användas tillsammans medRangeField.Det nya
RangeBoundary-uttrycket representerar intervallgränserna.De nya klasserna
AddIndexConcurrentlyochRemoveIndexConcurrentlytillåter att skapa och släppa indexCONCURRENTLYpå PostgreSQL.
django.contrib.sessions¶
The new
get_session_cookie_age()method allows dynamically specifying the session cookie age.
Cache¶
add_never_cache_headers()ochnever_cache()lägger nu till direktivetprivateiCache-Control-rubrikerna.
Fil delning¶
Den nya metoden
Storage.get_alternative_name()gör det möjligt att anpassa algoritmen för att generera filnamn om det redan finns en fil med det uppladdade namnet.
Formulär¶
Formsets may control the widget used when ordering forms via
can_orderby setting theordering_widgetattribute or overridingget_ordering_widget.
Internationalisering¶
Inställningarna
LANGUAGE_COOKIE_HTTPONLY,LANGUAGE_COOKIE_SAMESITEochLANGUAGE_COOKIE_SECURElades till för att ange flaggornaHttpOnly,SameSiteochSecureför språkcookies. Standardvärdena för dessa inställningar bevarar det tidigare beteendet.Stöd och översättningar för det uzbekiska språket har lagts till.
Loggning¶
Den nya parametern
reporter_classiAdminEmailHandler`gör det möjligt att tillhandahålla endjango.views.debug.ExceptionReporter-underklass för att anpassa spårningstexten som skickas till webbplatsenADMINS`närDEBUG`ärFalse.
Kommandon för hantering¶
Det nya alternativet
compilemessages --ignoregör det möjligt att ignorera specifika kataloger när man söker efter.po-filer att kompilera.showmigrations --listvisar nu de tillämpade datumtiderna när--verbosityär 2 och högre.På PostgreSQL stöder
dbshellnu TLS-certifikat på klientsidan.inspectdbintrospekterar nuOneToOneFieldnär en främmande nyckel har en unik eller primär nyckelbegränsning.Det nya
--skip-checks-alternativet hoppar över systemkontroller innan kommandot körs.Alternativen
startapp --templateochstartproject --templatestöder nu mallar som lagras i XZ-arkiv (.tar.xz,.txz) och LZMA-arkiv (.tar.lzma,.tlz).
Modeller¶
Lagt till hashdatabasfunktioner
MD5,SHA1,SHA224,SHA256,SHA384, ochSHA512.Lagt till databasfunktionen
Sign.Den nya parametern
is_dsti databasfunktionernaTruncbestämmer behandlingen av icke-existerande och tvetydiga datatider.connection.queriesvisar nuCOPY ... TOuttalanden på PostgreSQL.FilePathFieldaccepterar nu en anropsbar förpath.Tillåten symmetrisk mellantabell för självrefererande
ManyToManyField.Attributen
nameförCheckConstraint,UniqueConstraintochIndexstöder nu appetikett- och klassinterpolering med hjälp av platshållarna ``’%(app_label)s` och ``’%(class)s`.The new
Field.descriptor_classattribute allows model fields to customize the get and set behavior by overriding their descriptors.Lagt till
SmallAutoFieldsom fungerar ungefär som enAutoFieldförutom att den bara tillåter värden under en viss (databasberoende) gräns. Värden från1till32767är säkra i alla databaser som stöds av Django.AutoField,BigAutoField, ochSmallAutoFieldärver nu frånIntegerField,BigIntegerFieldrespektiveSmallIntegerField. Systemkontroller och validatorer ärvs nu också korrekt.FileField.upload_tostöder nupathlib.Path.CheckConstraintstöds nu av MySQL 8.0.16+.Den nya
allows_group_by_selected_pks_on_model()-metoden fördjango.db.backends.base.BaseDatabaseFeaturesmöjliggör optimering avGROUP BY-klausuler för att endast kräva de valda modellernas primära nycklar. Som standard stöds det endast för hanterade modeller på PostgreSQL.För att aktivera `` GROUP BY`` primär nyckeloptimering för ohanterade modeller måste du underklassa PostgreSQL-databasmotorn och åsidosätta funktionsklassens
allows_group_by_selected_pks_on_model()metod som du behöver. Se Subclassing the built-in database backends för ett exempel.
Förfrågningar och svar¶
Tillät
HttpResponseatt initieras medmemoryviewinnehåll.För användning i t.ex. Django-mallar tillåter
HttpRequest.headersnu uppslagningar med understreck (t.ex.user_agent) i stället för bindestreck.
Säkerhet¶
X_FRAME_OPTIONSär nu standardinställningen'DENY'. I äldre versioner ärX_FRAME_OPTIONSstandardinställningen'SAMEORIGIN'. Om din webbplats använder ramar av sig själv måste du uttryckligen ställa inX_FRAME_OPTIONS = 'SAMEORIGIN'för att de ska fortsätta att fungera.SECURE_CONTENT_TYPE_NOSNIFFhar nu standardvärdetTrue. Med detta aktiverat ställerSecurityMiddlewarein X-Content-Type-Options: nosniff-huvudet på alla svar som inte redan har det.SecurityMiddlewarekan nu skicka rubriken Referrer-Policy.
Tester¶
Det nya test
Client-argumentetraise_request_exceptiongör det möjligt att kontrollera om undantag som uppstår under begäran också ska uppstå i testet eller inte. Värdet är som standardTrueför bakåtkompatibilitet. Om det ärFalseoch ett undantag inträffar kommer testklienten att returnera ett 500-svar med attributetexc_info, en tupel som ger information om det undantag som inträffade.Tester och testfall som ska köras kan väljas utifrån ett testnamnsmönster med hjälp av det nya alternativet
test -k.HTML-jämförelse, som används av
assertHTMLEqual(), behandlar nu text, teckenreferenser och entitetsreferenser som hänvisar till samma tecken som likvärdiga.DiscoverRunnerkan nu skapa en debugger vid varje fel eller misslyckande med hjälp avtest --pdb.
Bakåtkompatibla ändringar i 3.0¶
Model.save() när du tillhandahåller en standard för den primära nyckeln¶
Model.save() försöker inte längre hitta en rad när en ny Model-instans sparas och ett standardvärde för primärnyckeln tillhandahålls, och utför alltid en enda INSERT-fråga. I äldre Django-versioner utförde Model.save() antingen en INSERT eller en UPDATE baserat på om raden finns eller inte.
Detta gör att anrop av Model.save() med ett standardvärde för primärnyckeln motsvarar att skicka force_insert=True till modellens save(). Försök att använda en ny Model-instans för att uppdatera en befintlig rad kommer att resultera i ett IntegrityError.
För att uppdatera en befintlig modell för ett specifikt primärnyckelvärde, använd update_or_create()-metoden eller QuerySet.filter(pk=...).update(...) istället. Exempel på detta:
>>> MyModel.objects.update_or_create(pk=existing_pk, defaults={"name": "new name"})
>>> MyModel.objects.filter(pk=existing_pk).update(name="new name")
Databas backend API¶
I det här avsnittet beskrivs ändringar som kan behövas i tredjeparts databasbackends.
Det andra argumentet i
DatabaseIntrospection.get_geometry_type()är nu radbeskrivningen istället för kolumnnamnet.DatabaseIntrospection.get_field_type()får inte längre returnera tupler.Om databasen kan skapa främmande nycklar i samma SQL-sats som lägger till ett fält, lägg till
SchemaEditor.sql_create_column_inline_fkmed lämplig SQL; i annat fall, sättDatabaseFeatures.can_create_inline_fk = False.DatabaseFeatures.can_return_id_from_insertochcan_return_ids_from_bulk_insertbyter namn tillcan_return_columns_from_insertochcan_return_rows_from_bulk_insert.Databasfunktioner hanterar nu
datetime.timezone-format när de skapas meddatetime.timedelta-instanser (t.ex.timezone(timedelta(hours=5)), som skulle ge ut'UTC+05:00'). Tredjeparts backends bör hantera detta format när de förberederDateTimeFieldidatetime_cast_date_sql(),datetime_extract_sql(), etc.Poster för
AutoField,BigAutoFieldochSmallAutoFieldläggs till iDatabaseOperations.integer_field_rangesför att stödja validerarna för heltalsintervall för dessa fälttyper. Backends från tredje part kan behöva anpassa standardposterna.DatabaseOperations.fetch_returned_insert_id()ersätts avfetch_returned_insert_columns()som returnerar en lista med värden som returneras avINSERT ... RETURNING-satsen, istället för ett enda värde.DatabaseOperations.return_insert_id()ersätts avreturn_insert_columns()som accepterar ettfieldsargument, vilket är en iterabel av fält som ska returneras efter inmatning. Vanligtvis är detta bara den autogenererade primärnyckeln.
django.contrib.admin¶
Admins ändringsmeddelanden för modellhistorik föredrar nu mer läsbara fältetiketter istället för fältnamn.
django.contrib.gis¶
Stöd för PostGIS 2.1 har tagits bort.
Stöd för SpatiaLite 4.1 och 4.2 har tagits bort.
Stöd för GDAL 1.11 och GEOS 3.4 har tagits bort.
Tappat stöd för PostgreSQL 9.4¶
Uppströmsstöd för PostgreSQL 9.4 slutar i december 2019. Django 3.0 stöder PostgreSQL 9.5 och högre.
Upphört stöd för Oracle 12.1¶
Uppströmsstöd för Oracle 12.1 upphör i juli 2021. Django 2.2 kommer att stödjas fram till april 2022. Django 3.0 stöder officiellt Oracle 12.2 och 18c.
Borttagna privata API:er för Python 2-kompatibilitet¶
Medan Python 2-stödet togs bort i Django 2.0, togs inte vissa privata API: er bort från Django så att tredjepartsappar kunde fortsätta använda dem tills Python 2 var slut.
Eftersom vi förväntar oss att appar tappar Python 2-kompatibiliteten när de lägger till stöd för Django 3.0, tar vi bort dessa API:er just nu.
django.test.utils.str_prefix()- Strängar har inte ’u’-prefix i Python 3.django.test.utils.patch_logger()- Användunittest.TestCase.assertLogs()istället.django.utils.lru_cache.lru_cache()- Alias förfunctools.lru_cache().django.utils.decorators.available_attrs()- Denna funktion returnerarfunctools.WRAPPER_ASSIGNMENTS.django.utils.decorators.ContextDecorator- Alias förcontextlib.ContextDecorator.django.utils._os.abspathu()- Alias föros.path.abspath().django.utils._os.upath()ochnpath()- Dessa funktioner gör ingenting på Python 3.django.utils.six- Ta bort användningen av detta vendored-bibliotek eller byt till six.django.utils.encoding.python_2_unicode_compatible()- Alias försix.python_2_unicode_compatible().django.utils.functional.curry()- Användfunctools.partial()ellerfunctools.partialmethod. See 5b1c389603a353625ae1603ba345147356336afb.django.utils.safestring.SafeBytes- Oanvänd sedan Django 2.0.
Nytt standardvärde för inställningen FILE_UPLOAD_PERMISSIONS¶
I äldre versioner är standardinställningen för FILE_UPLOAD_PERMISSIONS None. Med standardinställningen FILE_UPLOAD_HANDLERS resulterar detta i att uppladdade filer har olika behörigheter beroende på storlek och vilken uppladdningshanterare som används.
FILE_UPLOAD_PERMISSIONS har nu standardvärdet 0o644 för att undvika denna inkonsekvens.
Nya standardvärden för säkerhetsinställningar¶
För att göra Django-projekt säkrare som standard har vissa säkerhetsinställningar nu säkrare standardvärden:
X_FRAME_OPTIONSär nu standardvärdet'DENY'.SECURE_CONTENT_TYPE_NOSNIFFär nu standardvärdetTrue.
Se Vad är nytt Säkerhetsavsnittet ovan för mer information om dessa ändringar.
Diverse¶
ContentType.__str__()inkluderar nu modellensapp_labelför att särskilja modeller med samma namn i olika appar.Eftersom åtkomst till språket i sessionen snarare än i cookien är föråldrad, letar
LocaleMiddlewareinte längre efter användarens språk i sessionen ochdjango.contrib.auth.logout()bevarar inte längre sessionens språk efter utloggning.django.utils.html.escape()använder nuhtml.escape()för att escapa HTML. Detta konverterar'till'istället för den tidigare motsvarande decimalkoden'.Alternativet
django-admin test -kfungerar nu som alternativetunittest -ksnarare än som en genväg för--keepdb.Stöd för
pywatchman< 1.2.0 har tagits bort.urlencode()kodar nu itererbara värden som de är närdoseq=False, snarare än att iterera dem, vilket gör att den är i linje med standardbiblioteketsurllib.parse.urlencode()-funktion.mallfiltret
intwordöversätter nu1.0som en singularfras och alla andra numeriska värden som plural. Detta kan vara felaktigt för vissa språk.Tilldelning av ett värde till en modells
ForeignKeyellerOneToOneField'_id'attribut avaktiverar nu motsvarande fält. Att komma åt fältet efteråt kommer att resultera i en fråga.patch_vary_headers()hanterar nu en asterisk'*'enligt RFC 7231 Section 7.1.4, dvs. om en lista med namn på rubrikfält innehåller en asterisk, så kommer rubrikenVaryatt bestå av en enda asterisk'*'.I MySQL 8.0.16+ inkluderar
PositiveIntegerFieldochPositiveSmallIntegerFieldnu en kontrollbegränsning för att förhindra negativa värden i databasen.alias=Noneläggs till i signaturen förExpression.get_group_by_cols().RegexPattern, som används avre_path(), returnerar inte längre nyckelordsargument medNone-värden som ska skickas till vyn för de valfria namngivna grupper som saknas.
Funktioner som inte längre är aktuella i 3.0¶
django.utils.encoding.force_text() och smart_text()¶
Aliasen smart_text() och force_text() (sedan Django 2.0) för smart_str() och force_str() är föråldrade. Ignorera denna föråldring om din kod stöder Python 2 eftersom beteendet för smart_str() och force_str() är annorlunda där.
Diverse¶
django.utils.http.urlquote(),urlquote_plus(),urlunquote()ochurlunquote_plus()är avförda till förmån för de funktioner som de är alias för:urllib.parse.quote(),quote_plus(),unquote(), ochunquote_plus().django.utils.translation.ugettext(),ugettext_lazy(),ugettext_noop(),ungettext()ochungettext_lazy()är avförda till förmån för de funktioner som de är alias för:django.utils.translation.gettext(),gettext_lazy(),gettext_noop(),ngettext()ochngettext_lazy().För att begränsa skapandet av sessioner och därmed gynna vissa cachningsstrategier kommer
django.views.i18n.set_language()att sluta ställa in användarens språk i sessionen i Django 4.0. Sedan Django 2.1 lagras språket alltid iLANGUAGE_COOKIE_NAME-cookien.django.utils.text.unescape_entities()är utfasad till förmån förhtml.unescape(). Observera att till skillnad frånunescape_entities(), utvärderarhtml.unescape()lata strängar omedelbart.För att undvika eventuell förvirring vad gäller effektiv räckvidd har det privata interna verktyget
is_safe_url()bytt namn tillurl_has_allowed_host_and_scheme(). Att en URL har en tillåten värd och ett tillåtet schema innebär i allmänhet inte att den är ”säker”. Den kan fortfarande citeras felaktigt, till exempel. Se till att även användairi_to_uri()på sökvägskomponenten i opålitliga URL:er.
Funktioner borttagna i 3.0¶
Dessa funktioner har nått slutet av sin utfasningscykel och tas bort i Django 3.0.
Se Funktioner som inte längre är aktuella i 2.0 för detaljer om dessa ändringar, inklusive hur man tar bort användningen av dessa funktioner.
Modulen
django.db.backends.postgresql_psycopg2tas bort.django.shortcuts.render_to_response()har tagits bort.Inställningen
DEFAULT_CONTENT_TYPEtas bort.HttpRequest.xreadlines()har tagits bort.Stöd för argumentet
contextiField.from_db_value()ochExpression.convert_value()har tagits bort.Nyckelordsargumentet
field_nameiQuerySet.earliest()ochlatest()har tagits bort.
Se Funktioner som inte längre är aktuella i 2.1 för detaljer om dessa ändringar, inklusive hur man tar bort användningen av dessa funktioner.
GIS-funktionen
ForceRHRhar tagits bort.django.utils.http.cookie_date()har tagits bort.Malltaggbiblioteken
staticfilesochadmin_statichar tagits bort.django.contrib.staticfiles.templatetags.staticfiles.static()tas bort.