Django 3.2 release notes¶
6 april 2021
Välkommen till Django 3.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 3.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 3.2 betecknas som en long-term support release. Den kommer att få säkerhetsuppdateringar i minst tre år efter lanseringen. Stöd för den tidigare LTS, Django 2.2, kommer att upphöra i april 2022.
Kompatibilitet med Python¶
Django 3.2 stöder Python 3.6, 3.7, 3.8, 3.9 och 3.10 (från och med 3.2.9). Vi rekommenderar starkt och stöder endast officiellt den senaste utgåvan av varje serie.
Vad är nytt i Django 3.2¶
Automatisk :klass:`~django.apps.AppConfig` upptäckt¶
De flesta pluggbara applikationer definierar en AppConfig
-underklass i en apps.py
-undermodul. Många definierar en variabel default_app_config
som pekar på denna klass i sin __init__.py
.
När undermodulen apps.py
finns och definierar en enda AppConfig
-underklass, använder Django nu den konfigurationen automatiskt, så du kan ta bort default_app_config
.
default_app_config
gjorde det möjligt att endast deklarera applikationens sökväg i INSTALLED_APPS
(t.ex. 'django.contrib.admin'
) istället för appkonfigurationens sökväg (t.ex. 'django.contrib.admin.apps.AdminConfig'
). Det infördes för bakåtkompatibilitet med den tidigare stilen, med avsikten att byta ekosystemet till den senare, men bytet skedde inte.
Med automatisk upptäckt av AppConfig
behövs inte längre default_app_config
. Som en konsekvens av detta är den utfasad.
Se Konfigurera applikationer för fullständig information.
Anpassa typen av automatiskt skapade primärnycklar¶
När en modell definieras, om inget fält i en modell definieras med primary_key=True
, läggs en implicit primärnyckel till. Typen av denna implicita primärnyckel kan nu styras via inställningen DEFAULT_AUTO_FIELD
och attributet AppConfig.default_auto_field
. Du behöver inte längre åsidosätta primärnycklar i alla modeller.
För att bibehålla det historiska beteendet är standardvärdet för DEFAULT_AUTO_FIELD
AutoField
. Från och med 3.2 genereras nya projekt med DEFAULT_AUTO_FIELD
inställd på BigAutoField
. Dessutom genereras nya appar med AppConfig.default_auto_field
satt till BigAutoField
. I en framtida Django-version kommer standardvärdet för DEFAULT_AUTO_FIELD
att ändras till BigAutoField
.
För att undvika oönskade migreringar i framtiden kan du antingen uttryckligen ange DEFAULT_AUTO_FIELD
till AutoField
:
DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
eller konfigurera det per app:
from django.apps import AppConfig
class MyAppConfig(AppConfig):
default_auto_field = "django.db.models.AutoField"
name = "my_app"
eller för varje enskild modell:
from django.db import models
class MyModel(models.Model):
id = models.AutoField(primary_key=True)
I väntan på att standardinställningen ändras kommer en systemkontroll att ge en varning om du inte har en explicit inställning för DEFAULT_AUTO_FIELD
.
När du ändrar värdet på DEFAULT_AUTO_FIELD
kan migreringar för primärnyckeln i befintliga automatiskt skapade genomgående tabeller inte genereras för närvarande. Se dokumentationen för DEFAULT_AUTO_FIELD
för mer information om migrering av sådana tabeller.
Funktionella index¶
Det nya *expressions
positionella argumentet för Index()
gör det möjligt att skapa funktionella index på uttryck och databasfunktioner. Till exempel:
from django.db import models
from django.db.models import F, Index, Value
from django.db.models.functions import Lower, Upper
class MyModel(models.Model):
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
height = models.IntegerField()
weight = models.IntegerField()
class Meta:
indexes = [
Index(
Lower("first_name"),
Upper("last_name").desc(),
name="first_last_name_idx",
),
Index(
F("height") / (F("weight") + Value(5)),
name="calc_idx",
),
]
Funktionella index läggs till i modeller med hjälp av alternativet Meta.indexes
.
stöd för pymemcache
¶
Den nya django.core.cache.backends.memcached.PyMemcacheCache
cache-backend gör det möjligt att använda pymemcache-biblioteket för memcached. pymemcache
3.4.0 eller högre krävs. För mer information, se dokumentation om cachelagring i Django.
Nya dekoratorer för administratörssidan¶
Den nya display()
-dekoratorn gör det enkelt att lägga till alternativ till anpassade visningsfunktioner som kan användas med list_display
eller readonly_fields
.
På samma sätt gör den nya action()
-dekoratorn det möjligt att enkelt lägga till alternativ till åtgärdsfunktioner som kan användas med actions
.
Att använda @display
-dekoratorn har fördelen att det nu är möjligt att använda @property
-dekoratorn när man behöver ange attribut för den anpassade metoden. Tidigare var det nödvändigt att använda funktionen property()
istället efter att ha tilldelat metoden de nödvändiga attributen.
Att använda dekoratorer har fördelen att dessa alternativ är lättare att upptäcka eftersom de kan föreslås av kompletteringsverktyg i kodredigerare. De är bara en bekvämlighet och ställer fortfarande in samma attribut på funktionerna under huven.
Mindre funktioner¶
django.contrib.admin
¶
ModelAdmin.search_fields
tillåter nu sökning mot citerade fraser med mellanslag.Skrivskyddade relaterade fält återges nu som navigerbara länkar om målmodeller registreras i admin.
Administratören har nu stöd för teman och inkluderar ett mörkt tema som aktiveras enligt webbläsarens inställningar. Se Stöd för tematisering för mer information.
ModelAdmin.autocomplete_fields
respekterar nuForeignKey.to_field
ochForeignKey.limit_choices_to
vid sökning i en relaterad modell.Administratören installerar nu en sista catch-all-vy som omdirigerar oautentiserade användare till inloggningssidan, oavsett om URL:en i övrigt är giltig. Detta skyddar mot en potentiell sekretessfråga för modelluppräkning.
Även om det inte rekommenderas kan du ställa in den nya
AdminSite.final_catch_all_view
tillFalse
för att inaktivera catch-all-vyn.
django.contrib.auth
¶
Standardantalet iterationer för PBKDF2-lösenordshashen ökas från 216.000 till 260.000.
Standardvarianten för lösenordshashen Argon2 ändras till Argon2id.
memory_cost
ochparallelism
ökas till 102.400 respektive 8 för att matchaargon2-cffi
standardinställningarna.Om man ökar
minneskostnaden
ökar det erforderliga minnet från 512 KB till 100 MB. Detta är fortfarande ganska konservativt men kan leda till problem i minnesbegränsade miljöer. Om så är fallet kan den befintliga hasharen underklassas för att åsidosätta standardvärdena.Standardsaltets entropi för lösenordshasharna Argon2, MD5, PBKDF2 och SHA-1 har ökats från 71 till 128 bitar.
django.contrib.contenttypes
¶
Det nya
absolute_max
-argumentet förgeneric_inlineformset_factory()
gör det möjligt att anpassa det maximala antalet formulär som kan instansieras när man tillhandahållerPOST
-data. Se Begränsning av det maximala antalet instansierade formulär för mer information.Det nya argumentet
can_delete_extra
förgeneric_inlineformset_factory()
gör det möjligt att ta bort möjligheten att ta bort extra formulär. Secan_delete_extra
för mer information.
django.contrib.gis
¶
Metoden
GDALRaster.transform()
stöder nuSpatialReference
.Klassen
DataSource
har nu stöd förpathlib.Path
.Klassen
LayerMapping
stöder nupathlib.Path
.
django.contrib.postgres
¶
Det nya
ExclusionConstraint.include
-attributet gör det möjligt att skapa täckande uteslutningsbegränsningar på PostgreSQL 12+.Det nya attributet
ExclusionConstraint.opclasses
tillåter inställning av PostgreSQL-operatörsklasser.Det nya attributet
JSONBAgg.ordering
bestämmer ordningsföljden för de aggregerade elementen.Det nya attributet
JSONBAgg.distinct
avgör om aggregerade värden ska vara distinkta.Operationen
CreateExtension
kontrollerar nu att tillägget redan finns i databasen och hoppar över migreringen om så är fallet.De nya
CreateCollation
ochRemoveCollation
-operationerna gör det möjligt att skapa och släppa kollationer på PostgreSQL. Se Hantera kollationer med hjälp av migreringar för mer information.Uppslagningar för
ArrayField
tillåter nu (icke-nästlade) arrayer som innehåller uttryck som höger sida.Det nya
OpClass()
uttrycket gör det möjligt att skapa funktionella index på uttryck med en anpassad operatorklass. Se Funktionella index för mer information.
django.contrib.sitemaps
¶
De nya attributen
Sitemap
alternates
,languages
ochx_default
gör det möjligt att generera alternativ till lokaliserade versioner av dina sidor.
Databas backends¶
Tredjeparts databasbackends kan nu hoppa över eller markera som förväntade misslyckanden tester i Djangos testsvit med hjälp av de nya attributen
DatabaseFeatures.django_test_skips
ochdjango_test_expected_failures
.
Dekoratörer¶
Den nya
no_append_slash()
-dekoratorn gör att enskilda vyer kan uteslutas frånAPPEND_SLASH
URL-normalisering.
Felrapportering¶
Anpassade
ExceptionReporter
-underklasser kan nu definiera egenskapernahtml_template_path
ochtext_template_path
för att åsidosätta de mallar som används för att rendera undantagsrapporter.
Filuppladdning¶
Den nya
FileUploadHandler.upload_interrupted()
callbacken gör det möjligt att hantera avbrutna uppladdningar.
Formulär¶
Det nya
absolute_max
-argumentet förformset_factory()
,inlineformset_factory()
ochmodelformset_factory()
gör det möjligt att anpassa det maximala antalet formulär som kan instansieras när man levererarPOST
-data. Se Begränsning av det maximala antalet instansierade formulär för mer information.Det nya argumentet
can_delete_extra
förformset_factory()
,inlineformset_factory()
ochmodelformset_factory()
gör det möjligt att ta bort möjligheten att radera extra formulär. Secan_delete_extra
för mer information.BaseFormSet
rapporterar nu ett användarvänligt fel, snarare än att skapa ett undantag, när förvaltningsformuläret saknas eller har manipulerats. För att anpassa detta felmeddelande, skicka argumenteterror_messages
med nyckeln'missing_management_form'
när du instansierar formsetet.
Generiska åsikter¶
Attributen
week_format
iWeekMixin
ochWeekArchiveView
stöder nu veckoformatet'%V'
ISO 8601.
Kommandon för hantering¶
loaddata
stöder nu fixturer lagrade i XZ-arkiv (.xz
) och LZMA-arkiv (.lzma
).dumpdata
kan nu komprimera data i formatenbz2
,gz
,lzma
ellerxz
.makemigrations
kan nu anropas utan en aktiv databasanslutning. I det fallet hoppas kontrollen av en konsekvent migreringshistorik över.BaseCommand.requires_system_checks
stöder nu angivande av en lista med taggar. Systemkontroller som är registrerade i de valda taggarna kommer att kontrolleras för fel innan kommandot körs. I tidigare versioner utfördes antingen alla eller inga av systemkontrollerna.Stöd för färgad terminalutmatning i Windows har uppdaterats. Olika moderna terminalmiljöer upptäcks automatiskt och alternativen för att aktivera stöd i andra fall har förbättrats. Se Syntax färgläggning för mer information.
Migreringar¶
Den nya egenskapen
Operation.migration_name_fragment
gör det möjligt att ange ett filnamnsfragment som kommer att användas för att namnge en migration som endast innehåller den operationen.Migreringar stöder nu serialisering av rena och konkreta sökvägsobjekt från
pathlib
ochos.PathLike
-instanser.
Modeller¶
Den nya `` no_key`` -parametern för :meth:`.QuerySet.select_for_update() `, som stöds på PostgreSQL, gör det möjligt att förvärva svagare lås som inte blockerar skapandet av rader som refererar till låsta rader genom en främmande nyckel.
When()
uttrycket tillåter nu användning avcondition
argumentet medlookups
.De nya attributen
Index.include
ochUniqueConstraint.include
gör det möjligt att skapa täckande index och täcka unika begränsningar på PostgreSQL 11+.Det nya attributet
UniqueConstraint.opclasses
tillåter inställning av PostgreSQL-operatörsklasser.Metoden
QuerySet.update()
respekterar nuorder_by()
-klausulen på MySQL och MariaDB.FilteredRelation()
stöder nu nästlade relationer.Argumentet
of
iQuerySet.select_for_update()
är nu tillåtet i MySQL 8.0.1+.Value()
-uttryck löser nu automatiskt upp sittoutput_field
till lämpligField
-underklass baserat på typen av dess tillhandahållnavalue
förbool
,bytes
,float
,int
,str
,datetime.date
,datetime.datetime
,datetime.time
,datetime.timedelta
,decimal.Decimal
, ochuuid.UUID
instanser. Som en följd av detta kan upplösningen av ettoutput_field
för databasfunktioner och kombinerade uttryck nu krascha med blandade typer närValue()
används. Du måste uttryckligen angeoutput_field
i sådana fall.Den nya metoden
QuerySet.alias()
gör det möjligt att skapa återanvändbara alias för uttryck som inte behöver väljas men som används för filtrering, ordning eller som en del av komplexa uttryck.Den nya
Collate
-funktionen gör det möjligt att filtrera och ordna efter angivna databaskollationer.Argumentet
field_name
iQuerySet.in_bulk()
accepterar nu distinkta fält om det bara finns ett fält angivet iQuerySet.distinct()
.Den nya parametern
tzinfo
i databasfunktionernaTruncDate
ochTruncTime
gör det möjligt att trunkera datatider i en specifik tidszon.Det nya argumentet
db_collation
förCharField
ochTextField
gör det möjligt att ange en databaskollation för fältet.Lagt till databasfunktionen
Random
.Aggregeringsfunktioner,
F()
,OuterRef()
och andra uttryck tillåter nu användning av transformationer. Se använda-transformationer-i-uttryck för detaljer.Det nya argumentet
durable
föratomic()
garanterar att ändringar som görs i det atomiska blocket kommer att bekräftas om blocket avslutas utan fel. Ett nästlat atomiskt block som markerats som hållbart kommer att ge upphov till ettRuntimeError
.Lagt till databasfunktionen
JSONObject
.
Sidindelning¶
Den nya
django.core.paginator.Paginator.get_elided_page_range()
-metoden gör det möjligt att generera ett sidintervall med några av värdena borttagna. Om det finns ett stort antal sidor kan detta vara till hjälp för att generera ett rimligt antal sidlänkar i en mall.
Förfrågningar och svar¶
Svarshuvuden lagras nu i
HttpResponse.headers
. Detta kan användas istället för det ursprungliga diktliknande gränssnittet förHttpResponse
-objekt. Båda gränssnitten kommer att fortsätta att stödjas. Se Ställa in rubrikfält för detaljer.Den nya parametern
headers
iHttpResponse
,SimpleTemplateResponse
ochTemplateResponse
gör det möjligt att ställa in svarheaders
vid instansiering.
Säkerhet¶
Inställningen
SECRET_KEY
kontrolleras nu för ett giltigt värde vid första åtkomst, i stället för när inställningarna laddas första gången. Detta gör det möjligt att köra hanteringskommandon som inte förlitar sig påSECRET_KEY
utan att behöva ange ett värde. Som en konsekvens av detta kommer anrop avconfigure()
utan att tillhandahålla en giltigSECRET_KEY
och sedan fortsätta att komma åtettings.SECRET_KEY
nu att ge upphov till ettImproperlyConfigured
undantag.De nya metoderna
Signer.sign_object()
ochSigner.unsign_object()
gör det möjligt att signera komplexa datastrukturer. Se Skydd av komplexa datastrukturer för mer information.Dessutom blir
signing.dumps()
ochloads()
genvägar förTimestampSigner.sign_object()
ochunsign_object()
.
Serialisering¶
Signaler¶
Signal.send_robust()
loggar nu undantag.
Mallar¶
floatformat
mallfilter tillåter nu användning av suffixetg
för att tvinga fram gruppering medTHOUSAND_SEPARATOR
för den aktiva locale.Mallar som cachats med Cached template loaders laddas nu om korrekt under utveckling.
Tester¶
Objekt som tilldelats klassattribut i
TestCase.setUpTestData()
är nu isolerade för varje testmetod. Sådana objekt krävs nu för att stödja skapandet av djupa kopior medcopy.deepcopy()
. Tilldelning av objekt som inte stöderdeepcopy()
är föråldrad och kommer att tas bort i Django 4.1.DiscoverRunner
aktiverar nufaulthandler
som standard. Detta kan inaktiveras genom att använda alternativettest --no-faulthandler
.DiscoverRunner
och hanteringskommandottest
kan nu spåra tidpunkter, inklusive databasinstallation och total körtid. Detta kan aktiveras genom att använda alternativettest --timing
.Client
bevarar nu frågesträngen för begäran när 307- och 308-omdirigeringar följs.Den nya metoden
TestCase.captureOnCommitCallbacks()
fångar upp callback-funktioner som skickas tilltransaction.on_commit()
i en lista. Detta gör att du kan testa sådana callbacks utan att använda den långsammareTransactionTestCase
.TransactionTestCase.assertQuerysetEqual()
stöder nu direkt jämförelse mot en annan queryset i stället för att begränsas till jämförelse mot en lista med strängrepresentationer av objekt när standardvärdet för argumentettransform
används.
Verktyg¶
Den nya parametern
depth
i funktionernadjango.utils.timesince.timesince()
ochdjango.utils.timesince.timeuntil()
gör det möjligt att ange antalet intilliggande tidsenheter som ska returneras.
Validerare¶
Inbyggda validerare inkluderar nu det angivna värdet i argumentet
params
i ett uppkommetValidationError
. Detta gör att anpassade felmeddelanden kan använda platshållaren%(value)s
.Jämlikhetsoperatorn
ValidationError
ignorerar nu ordningsföljden förmessages
ochparams
.
Bakåtkompatibla ändringar i 3.2¶
Databas backend API¶
I det här avsnittet beskrivs ändringar som kan behövas i tredjeparts databasbackends.
Den nya egenskapen
DatabaseFeatures.introspected_field_types
ersätter dessa funktioner:kan_introspektera_autofält
kan_introspektera_stort_integerfält
kan_introspektera_binärt_fält
kan_introspektera_decimal_fält
kan_introspektera_duration_fält
kan_introspektera_ip_adressfält
kan_introspektera_positivt_ heltalsfält
kan_introspektera_litet_ heltalsfält
kan_introspektera_tid_fält
introspected_big_auto_field_type
introspected_small_auto_field_type
introspected_boolean_field_type
Om du vill aktivera stöd för täckande index (
Index.include
) och täckande unika begränsningar (UniqueConstraint.include
) anger duDatabaseFeatures.supports_covering_indexes
tillTrue
.Tredjeparts databasbackends måste implementera stöd för kolumndatabaskollationer på
CharField
ochTextField
eller sättaDatabaseFeatures.supports_collation_on_charfield
ochDatabaseFeatures.supports_collation_on_textfield
tillFalse
. Om icke-deterministiska kollationer inte stöds, sättupports_non_deterministic_collations
tillFalse
.DatabaseOperations.random_function_sql()
tas bort till förmån för den nyaRandom
databasfunktionen.DatabaseOperations.date_trunc_sql()
ochDatabaseOperations.time_trunc_sql()
tar nu det valfria argumentettzname
för att trunkera i en specifik tidszon.DatabaseClient.runshell()
hämtar nu argument och en valfri ordbok med miljövariabler till den underliggande kommandoradsklienten frånDatabaseClient.settings_to_cmd_args_env()
-metoden. Tredjeparts databasbackends måste implementeraDatabaseClient.settings_to_cmd_args_env()
eller åsidosättaDatabaseClient.runshell()
.Tredjeparts databasbackends måste implementera stöd för funktionella index (
Index.expressions
) eller angeDatabaseFeatures.supports_expression_indexes
tillFalse
. OmCOLLATE
inte är en del avCREATE INDEX
-satsen, sättDatabaseFeatures.collate_as_index_expression
tillTrue
.
django.contrib.admin
¶
Pagineringslänkar i admin är nu 1-indexerade istället för 0-indexerade, dvs. frågesträngen för den första sidan är
?p=1
istället för?p=0
.Den nya admin catch-all-vyn kommer att bryta URL-mönster som dirigeras efter admin-URL:erna och som matchar admin-URL-prefixet. Du kan antingen justera din URL-ordning eller, om nödvändigt, ställa in
AdminSite.final_catch_all_view
tillFalse
, vilket inaktiverar catch-all-vyn. Se Vad är nytt i Django 3.2 för mer information.Minifierade JavaScript-filer ingår inte längre i admin. Om du vill att dessa filer ska minifieras bör du överväga att använda en tredjepartsapp eller ett externt byggverktyg. De minifierade JavaScript-filerna från vendored som paketeras med administratören (t.ex. jquery.min.js) ingår fortfarande.
ModelAdmin.prepopulated_fields
tar inte längre bort engelska stoppord, som'a'
eller'an'
.
django.contrib.gis
¶
Stöd för PostGIS 2.2 har tagits bort.
Oracle-backend klonar nu polygoner (och geometrisamlingar som innehåller polygoner) innan de orienteras om och sparas i databasen. De muteras inte längre på plats. Du kanske märker detta om du använder polygonerna efter att en modell har sparats.
Tappat stöd för PostgreSQL 9.5¶
Uppströmsstöd för PostgreSQL 9.5 slutar i februari 2021. Django 3.2 stöder PostgreSQL 9.6 och högre.
Borttaget stöd för MySQL 5.6¶
Slutet på uppströmsstöd för MySQL 5.6 är april 2021. Django 3.2 stöder MySQL 5.7 och högre.
Diverse¶
Django stöder nu tidszoner som inte är ”pytz”, till exempel Python 3.9+:s modul
zoneinfo
och dess bakport.Den odokumenterade metoden
SpatiaLiteOperations.proj4_version()
har bytt namn tillproj_version()
.slugify()
tar nu bort ledande och efterföljande bindestreck och understreck.Mallfiltren
intcomma
ochintword
är inte längre beroende av inställningenUSE_L10N
.Stöd för
argon2-cffi
< 19.1.0 har tagits bort.Cache-nycklarna innehåller inte längre språket när internationalisering är inaktiverad (
USE_I18N = False
) och lokalisering är aktiverad (USE_L10N = True
). Efter uppgradering till Django 3.2 i sådana konfigurationer kommer den första begäran till ett tidigare cachat värde att vara en cachemiss.ForeignKey.validate()
använder nu_base_manager
istället för_default_manager
för att kontrollera att relaterade instanser finns.När en applikation definierar en
AppConfig
-underklass i enapps.py
-undermodul, använder Django nu denna konfiguration automatiskt, även om den inte är aktiverad meddefault_app_config
. Ställ indefault = False
i underklassenAppConfig
om du behöver förhindra detta beteende. Se Vad är nytt i Django 3.2 för mer information.Instansiering av en abstrakt modell ger nu upphov till
TypeError
.Nyckelord-argument till
setup_databases()
är nu endast nyckelord.Den odokumenterade funktionen
django.utils.http.limited_parse_qsl()
har tagits bort. Användurllib.parse.parse_qsl()
istället.django.test.utils.TestContextDecorator
använder nuaddCleanup()
så att upprensningar som registrerats i metodensetUp`()
anropas innanTestContextDecorator.disable()
.SessionMiddleware
ger nu upphov till ettSessionInterrupted
-undantag istället förSuspiciousOperation
när en session förstörs i en samtidig begäran.Jämlikhetsoperatorn
django.db.models.Field
skiljer nu korrekt mellan ärvda fältinstanser i olika modeller. Dessutom definieras nu ordningsföljden för sådana fält.Den odokumenterade funktionen
django.core.files.locks.lock()
returnerar nuFalse
om filen inte kan låsas, istället för att ge upphov tillBlockingIOError
.Mekanismen för återställning av lösenord ogiltigförklarar nu tokens när användarens e-postadress ändras.
kommandot
makemessages
behandlar inte längre ogiltiga lokaliteter som anges med alternativetmakemessages --locale
, när de innehåller bindestreck ('-'
).Formulärfältet
django.contrib.auth.forms.ReadOnlyPasswordHashField
är nudisabled`
som standard. Därför krävs inte längre attUserChangeForm.clean_password()
returnerar det ursprungliga värdet.Cache-operationerna
cache.get_many()
,get_or_set()
,has_key()
,incr()
,decr()
,incr_version()
ochdecr_version()
hanterar nu korrektNone
som lagras i cachen, på samma sätt som alla andra värden, istället för att bete sig som om nyckeln inte existerade.På grund av en begränsning i
python-memcached
behålls det tidigare beteendet för den föråldradeMemcachedCache
-backend.Den lägsta versionen av SQLite som stöds har höjts från 3.8.3 till 3.9.0.
CookieStorage
lagrar nu meddelanden i det format som överensstämmer med RFC 6265. Stöd för cookies som använder det gamla formatet finns kvar fram till Django 4.1.Den lägsta versionen av
asgiref
som stöds har ökats från 3.2.10 till 3.3.2.
Funktioner som inte längre är aktuella i 3.2¶
Diverse¶
Att tilldela objekt som inte stöder skapandet av djupa kopior med
copy.deepcopy()
till klassattribut iTestCase.setUpTestData()
är föråldrat.Att använda ett booleanskt värde i
BaseCommand.requires_system_checks
är föråldrat. Använd'__all__'
istället förTrue
, och[]
(en tom lista) istället förFalse
.Argumentet
whitelist
och attributetdomain_whitelist
iEmailValidator
är föråldrade. Användallowlist
istället förwhitelist
, ochdomain_allowlist
istället fördomain_whitelist
. Du kan behöva byta namn påwhitelist
i befintliga migreringar.Applikationskonfigurationsvariabeln
default_app_config
är utdaterad, på grund av den nu automatiskaAppConfig
-upptäckten. Se Vad är nytt i Django 3.2 för mer information.Att automatiskt anropa
repr()
på en queryset iTransactionTestCase.assertQuerysetEqual()
, när den jämförs med strängvärden, är föråldrat. Om du behöver det tidigare beteendet, ställ uttryckligen intransform
tillrepr
.Backend
django.core.cache.backends.memcached.MemcachedCache
är föråldrad eftersompython-memcached
har vissa problem och verkar vara ounderhållen. Använddjango.core.cache.backends.memcached.PyMemcacheCache
ellerdjango.core.cache.backends.memcached.PyLibMCCache
istället.Formatet på meddelanden som används av
django.contrib.messages.storage.cookie.CookieStorage
skiljer sig från det format som genereras av äldre versioner av Django. Stöd för det gamla formatet finns kvar fram till Django 4.1.