Django 3.0 release notes¶
2 december 2019
Välkommen till Django 3.0!
Dessa release notes 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 <https://mariadb.org/>`_ 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 :ref:``Enumerationstyper <field-choices-enum-types>` för mer information och exempel.
Mindre funktioner¶
django.contrib.admin
¶
Lagt till stöd för attributet
admin_order_field
på 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_token
iPasswordResetConfirmView
gö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.Lagt till
get_user_permissions()
-metoden för att spegla den befintligaget_group_permissions()
-metoden.Lagt till HTML-attributet
autocomplete
till widgets för användarnamn, e-post och lösenordsfält idjango.contrib.auth.forms
fö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_FIELDS
stö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
furlong
iDistance
.Inställningen
GEOIP_PATH
har nu stöd förpathlib.Path
.Klassen
GeoIP2
accepterar nupathlib.Path
path
.
django.contrib.postgres
¶
Den nya
RangeOperators
hjälper till att undvika typfel i SQL-operatorer som kan användas tillsammans medRangeField
.Det nya
RangeBoundary
-uttrycket representerar intervallgränserna.De nya klasserna
AddIndexConcurrently
ochRemoveIndexConcurrently
tillåter att skapa och släppa indexCONCURRENTLY
på PostgreSQL.
django.contrib.sessions
¶
Den nya metoden
get_session_cookie_age()
gör det möjligt att dynamiskt ange åldern på sessionens cookie.
Cache¶
add_never_cache_headers()
ochnever_cache()
lägger nu till direktivetprivate
iCache-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¶
Formuläruppsättningar kan styra den widget som används vid beställning av formulär via
can_order
genom att ställa in attributetordering_widget
eller åsidosättaget_ordering_widget()
.
Internationalisering¶
Inställningarna
LANGUAGE_COOKIE_HTTPONLY
,LANGUAGE_COOKIE_SAMESITE
ochLANGUAGE_COOKIE_SECURE
lades till för att ange flaggornaHttpOnly
,SameSite
ochSecure
fö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_class
iAdminEmailHandler`
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 --ignore
gör det möjligt att ignorera specifika kataloger när man söker efter.po
-filer att kompilera.showmigrations --list
visar nu de tillämpade datumtiderna när--verbosity
är 2 och högre.På PostgreSQL stöder
dbshell
nu TLS-certifikat på klientsidan.inspectdb
introspekterar nuOneToOneField
nä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 --template
ochstartproject --template
stö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_dst
i databasfunktionernaTrunc
bestämmer behandlingen av icke-existerande och tvetydiga datatider.connection.queries
visar nuCOPY ... TO
uttalanden på PostgreSQL.FilePathField
accepterar nu en anropsbar förpath
.Tillåten symmetrisk mellantabell för självrefererande
ManyToManyField
.Attributen
name
förCheckConstraint
,UniqueConstraint
ochIndex
stöder nu appetikett- och klassinterpolering med hjälp av platshållarna ``’%(app_label)s` och ``’%(class)s`.Det nya attributet
Field.descriptor_class
gör det möjligt för modellfält att anpassa get- och set-beteendet genom att åsidosätta deras descriptors.Lagt till
SmallAutoField
som fungerar ungefär som enAutoField
förutom att den bara tillåter värden under en viss (databasberoende) gräns. Värden från1
till32767
är säkra i alla databaser som stöds av Django.AutoField
,BigAutoField
, ochSmallAutoField
ärver nu frånIntegerField
,BigIntegerField
respektiveSmallIntegerField
. Systemkontroller och validatorer ärvs nu också korrekt.FileField.upload_to
stöder nupathlib.Path
.CheckConstraint
stöds nu av MySQL 8.0.16+.Den nya
allows_group_by_selected_pks_on_model()
-metoden fördjango.db.backends.base.BaseDatabaseFeatures
mö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 :ref:Subclassing the built-in database backends <subclassing-database-backends>
för ett exempel.
Förfrågningar och svar¶
Tillät
HttpResponse
att initieras medmemoryview
innehåll.För användning i t.ex. Django-mallar tillåter
HttpRequest.headers
nu 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_OPTIONS
standardinstä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_NOSNIFF
har nu standardvärdetTrue
. Med detta aktiverat ställerSecurityMiddleware
in X-Content-Type-Options: nosniff-huvudet på alla svar som inte redan har det.SecurityMiddleware
kan nu skicka rubriken Referrer-Policy.
Tester¶
Det nya test
Client
-argumentetraise_request_exception
gö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 standardTrue
för bakåtkompatibilitet. Om det ärFalse
och 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.DiscoverRunner
kan 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_fk
med lämplig SQL; i annat fall, sättDatabaseFeatures.can_create_inline_fk = False
.DatabaseFeatures.can_return_id_from_insert
ochcan_return_ids_from_bulk_insert
byter namn tillcan_return_columns_from_insert
ochcan_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örberederDateTimeField
idatetime_cast_date_sql()
,datetime_extract_sql()
, etc.Poster för
AutoField
,BigAutoField
ochSmallAutoField
läggs till iDatabaseOperations.integer_field_ranges
fö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 ettfields
argument, 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_label
fö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
LocaleMiddleware
inte 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 -k
fungerar nu som alternativetunittest -k
snarare ä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.0
som 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
ForeignKey
ellerOneToOneField
'_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 rubrikenVary
att bestå av en enda asterisk'*'
.I MySQL 8.0.16+ inkluderar
PositiveIntegerField
ochPositiveSmallIntegerField
nu en kontrollbegränsning för att förhindra negativa värden i databasen.alias=None
lä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_psycopg2
tas bort.django.shortcuts.render_to_response()
har tagits bort.Inställningen
DEFAULT_CONTENT_TYPE
tas bort.HttpRequest.xreadlines()
har tagits bort.Stöd för argumentet
context
iField.from_db_value()
ochExpression.convert_value()
har tagits bort.Nyckelordsargumentet
field_name
iQuerySet.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
ForceRHR
har tagits bort.django.utils.http.cookie_date()
har tagits bort.Malltaggbiblioteken
staticfiles
ochadmin_static
har tagits bort.django.contrib.staticfiles.templatetags.staticfiles.static()
tas bort.