Django 4.1 release notes¶
3 augusti 2022
Välkommen till Django 4.1!
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 4.0 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.
Kompatibilitet med Python¶
Django 4.1 stöder Python 3.8, 3.9, 3.10 och 3.11 (från och med 4.1.3). Vi rekommenderar starkt och stöder endast officiellt den senaste utgåvan av varje serie.
Vad är nytt i Django 4.1¶
Asynkrona hanterare för klassbaserade vyer¶
View-subklasser kan nu definiera asynkrona HTTP-metodhanterare:
import asyncio
from django.http import HttpResponse
from django.views import View
class AsyncView(View):
async def get(self, request, *args, **kwargs):
# Perform view logic using await.
await asyncio.sleep(1)
return HttpResponse("Hello async world!")
Se Asynkrona klassbaserade visningar för mer information.
Asynkront ORM-gränssnitt¶
QuerySet
tillhandahåller nu ett asynkront gränssnitt för alla dataåtkomstoperationer. Dessa namnges på samma sätt som de befintliga synkrona operationerna men med prefixet a
, till exempel acreate()
, aget()
, och så vidare.
Det nya gränssnittet gör att du kan skriva asynkron kod utan att behöva linda in ORM-operationer i sync_to_async()
:
async for author in Author.objects.filter(name__startswith="A"):
book = await author.books.afirst()
Observera att i detta skede förblir de underliggande databasoperationerna synkrona, med bidrag som pågår för att driva asynkront stöd ner i SQL-kompilatorn och integrera asynkrona databasdrivrutiner. Det nya asynkrona queryset-gränssnittet kapslar för närvarande in de nödvändiga sync_to_async()
-operationerna åt dig och kommer att göra det möjligt för din kod att dra nytta av utvecklingen av ORM:s asynkrona stöd när det utvecklas.
Se Asynkrona förfrågningar för detaljer och begränsningar.
Validering av begränsningar¶
begränsningarna Check
, unique
och exclusion
som definieras i alternativet Meta.constraints
kontrolleras nu under modellvalidering.
Tillgänglighet för rendering av formulär¶
För att underlätta för användare med skärmläsare och andra tekniska hjälpmedel finns nya formulärmallar baserade på<div> tillgängliga från och med den här versionen. Dessa ger en mer tillgänglig navigering än de äldre mallarna och kan gruppera relaterade kontroller, t.ex. radiolistor, i fältuppsättningar på ett korrekt sätt.
De nya mallarna rekommenderas och kommer att bli standardrenderingsstilen för formulär när du skriver ut ett formulär, som {{ form }}
i en mall, från Django 5.0.
För att göra det lättare att använda den nya utdatastilen kan standardformuläret och formulärmallarna nu konfigureras på projektnivå via inställningen FORM_RENDERER
.
Se formavsnittet (nedan) för fullständig information.
Mindre funktioner¶
django.contrib.admin
¶
CSS-variablerna för admin dark mode tillämpas nu i en separat stilmall och ett separat mallblock.
ModelAdmin Lista Filter som tillhandahåller anpassade
FieldListFilter
-underklasser kan nu styra värdeseparatorn för frågesträngen när man filtrerar efter flera värden med hjälp av__in
-uppslagningen.Admin
history view
är nu paginerad.Relaterade widgetomslag har nu en länk till objektets ändringsformulär.
Metoden
AdminSite.get_app_list()
gör det nu möjligt att ändra ordningen på appar och modeller på adminindexsidan.
django.contrib.auth
¶
Standardantalet iterationer för PBKDF2-lösenordshashen ökas från 320.000 till 390.000.
Metoden
RemoteUserBackend.configure_user()
gör det nu möjligt att synkronisera användarattribut med attribut i ett fjärrsystem, t.ex. en LDAP-katalog.
django.contrib.gis
¶
Den nya
GEOSGeometry.make_valid()
-metoden gör det möjligt att konvertera ogiltiga geometrier till giltiga.Det nya argumentet
clone
förGEOSGeometry.normalize()
gör det möjligt att skapa en normaliserad klon av geometrin.
django.contrib.postgres
¶
Den nya
BitXor()
-aggregatfunktionen returnerar ettint
av det bitvisaXOR
av alla icke-nullvärden.SpGistIndex
stöder nu täckande index på PostgreSQL 14+.ExclusionConstraint
stöder nu täckande uteslutningsbegränsningar med SP-GiST-index på PostgreSQL 14+.Det nya attributet
default_bounds
förDateTimeRangeField
ochDecimalRangeField
gör det möjligt att ange gränser för list- och tuple-ingångar.ExclusionConstraint
tillåter nu att operatörsklasser anges med uttrycketOpClass()
.
django.contrib.sitemaps
¶
Standardmallen för sitemap-index
<sitemapindex>
inkluderar nu tidsstämpeln<lastmod>
där den är tillgänglig, genom den nyaget_latest_lastmod()
-metoden. Anpassade indexmallar för webbplatskartor bör uppdateras för den justerade kontextvariabler.
django.contrib.staticfiles
¶
ManifestStaticFilesStorage
ersätter nu sökvägar till CSS-källkartreferenser med deras hashade motsvarigheter.
Databas backends¶
Tredjeparts databasbackends kan nu ange den lägsta version som krävs av databasen med hjälp av attributet
DatabaseFeatures.minimum_database_version
som är en tupel (t.ex.(10, 0)
betyder ”10.0”). Om en minsta version anges måste backends också implementeraDatabaseWrapper.get_database_version()
, som returnerar en tupel av den aktuella databasversionen. Backendets metodDatabaseWrapper.init_connection_state()
måste anropasuper()
för att kontrollen ska kunna köras.
Formulär¶
Den standardmall som används för att rendera formulär när de kastas till en sträng, t.ex. i mallar som
{{form }}
, kan nu konfigureras på projektnivå genom att ställa inform_template_name
på den klass som tillhandahålls förFORM_RENDERER
.Form.template_name
är nu en egenskap som överförs till renderingsprogrammet, men kan åsidosättas med ett strängvärde för att ange mallnamnet per formulärklass.På samma sätt kan standardmallen som används för att rendera formulär specificeras via det matchande
formset_template_name
renderer-attributet.Den nya formulärmallen
div.html
, som refererar till attributetForm.template_name_div
och metodenForm.as_div()
, renderar formulär med hjälp av HTML-elementen<div>
.Denna nya utdatastil rekommenderas framför de befintliga stilarna
as_table()
,as_p()
ochas_ul()
, eftersom mallen implementerar<fieldset>
och<legend>
för att gruppera relaterade indata och är lättare att navigera i för skärmläsaranvändare.Den div-baserade utskriften kommer att bli standardrenderingsstilen från Django 5.0.
För att underlätta antagandet av den nya utdatastilen
<div>
finns två övergångsklasser för formulärrenderare tillgängliga:django.forms.renderers.DjangoDivFormRenderer
ochdjango.forms.renderers.Jinja2DivFormRenderer
, för Django- respektive Jinja2-mallbackends.Du kan använda en av dessa via inställningen
FORM_RENDERER
. Till exempel:FORM_RENDERER = "django.forms.renderers.DjangoDivFormRenderer"
När utdatastilen
<div>
är standard, från Django 5.0, kommer dessa övergångsrenderare att avskrivas, för borttagning i Django 6.0. DeklarationenFORM_RENDERER
kan tas bort vid den tidpunkten.Om den nya utdatastilen
<div>
inte är lämplig för ditt projekt, bör du definiera en underklass för rendering som angerform_template_name
ochformset_template_name
för den önskade stilen och angeFORM_RENDERER
i enlighet med detta.Till exempel, för utdatastilen
<p>
som används avas_p()
, skulle du definiera en formulärrenderare som sätterform_template_name
till"django/forms/p.html"
ochformset_template_name
till"django/forms/formsets/p.html"
.Den nya
legend_tag()
tillåter rendering av fältetiketter i<legend>
taggar via det nyatag
argumentet ilabel_tag()
.Det nya argumentet
edit_only
förmodelformset_factory()
ochinlineformset_factory()
gör det möjligt att förhindra att nya objekt skapas.Klassattributen
js
ochcss
för Media tillåter nu användning av hashbara objekt, inte bara söksträngar, så länge som dessa objekt implementerar metoden__html__()
(vanligtvis när de dekoreras med dekoratornhtml_safe()
).De nya attributen
BoundField.use_fieldset
ochWidget.use_fieldset
hjälper till att identifiera widgets där indata ska grupperas i en<fieldset>
med en<legend>
.Argumentet Felmeddelanden för
BaseFormSet
gör det nu möjligt att anpassa felmeddelanden för ogiltigt antal formulär genom att skicka nycklarna'too_few_forms'
och'too_many_forms'
.IntegerField
,FloatField
ochDecimalField
accepterar nu valfritt ettstep_size
-argument. Detta används för att ställa in HTML-attributetstep
och valideras när formuläret skickas in.
Internationalisering¶
Funktionen
i18n_patterns()
stöder nu språk med både skript och regioner.
Kommandon för hantering¶
makemigrations --no-input
loggar nu standardsvar och anledningar till varför migreringar inte kan skapas.Det nya alternativet
makemigrations --scriptable
omdirigerar loggutdata och inmatningsfrågor tillstderr
och skriver endast sökvägar till genererade migreringsfiler tillstdout
.Det nya alternativet
migrate --prune
gör det möjligt att ta bort icke-existerande migreringar från tabellendjango_migrations
.Python-filer som skapats av
startproject
,startapp
,optimizemigration
,makemigrations
ochsquashmigrations
formateras nu med kommandotblack
om det finns i dinPATH
.Det nya kommandot
optimizemigration
gör det möjligt att optimera åtgärder för en migrering.
Migreringar¶
Den nya
RenameIndex
-operationen gör det möjligt att byta namn på index som definieras iMeta.indexes
ellerindex_together
-alternativen.Autodetektorn för migreringar genererar nu
RenameIndex
-operationer i stället förRemoveIndex
ochAddIndex
, när man byter namn på index som definieras iMeta.indexes
.Migreringsautodetektorn genererar nu
RenameIndex
-operationer istället förAlterIndexTogether
ochAddIndex
, när index som definieras iMeta.index_together
flyttas tillMeta.indexes
.
Modeller¶
Argumentet
order_by
iWindow
-uttrycket accepterar nu strängreferenser till fält och transformationer.Den nya inställningen
CONN_HEALTH_CHECKS
gör det möjligt att aktivera hälsokontroller för persistent database connections i syfte att minska antalet misslyckade förfrågningar, t.ex. efter omstart av databasservern.QuerySet.bulk_create()
stöder nu uppdatering av fält när en radinsättning misslyckas med unikhetsbegränsningar. Detta stöds på MariaDB, MySQL, PostgreSQL och SQLite 3.24+.QuerySet.iterator()
har nu stöd för prefetching av relaterade objekt så länge argumentetchunk_size
anges. I äldre versioner gjordes ingen prefetching.Q
-objekt och querysets kan nu kombineras med hjälp av^
som operatorn exclusive or (XOR
).XOR
har inbyggt stöd i MariaDB och MySQL. För databaser som inte stöderXOR
kommer frågan att konverteras till en motsvarighet med hjälp avAND
,OR
ochNOT
.Det nya attributet Field.non_db_attrs gör det möjligt att anpassa attribut för fält som inte påverkar en kolumndefinition.
På PostgreSQL skapas nu
AutoField
,BigAutoField
ochSmallAutoField
som identitetskolumner snarare än seriella kolumner med sekvenser.
Förfrågningar och svar¶
HttpResponse.set_cookie()
stöder nutimedelta
-objekt för argumentetmax_age
.
Säkerhet¶
Den nya inställningen
SECRET_KEY_FALLBACKS
gör det möjligt att ange en lista med värden för rotation av hemliga nycklar.Inställningen
SECURE_PROXY_SSL_HEADER
stöder nu en kommaseparerad lista med protokoll i rubrikvärdet.
Signaler¶
Signalerna
pre_delete
ochpost_delete
skickar nu ut raderingensursprung
.
Mallar¶
HTML-elementets
<script>``id
-attribut krävs inte längre närjson_script
-mallfiltret paketeras.cached template loader
är nu aktiverad under utveckling, närDEBUG
ärTrue
, ochOPTIONS['loaders']
inte är specificerad. Du kan angeOPTIONS['loaders']
för att åsidosätta detta, om det behövs.
Tester¶
DiscoverRunner
stöder nu parallella tester på macOS, Windows och alla andra system där standardstartmetoden förmultiprocessing
ärspawn
.Ett nästlat atomic block som markerats som hållbart i
django.test.TestCase
ger nu upphov till ettRuntimeError
, på samma sätt som utanför tester.SimpleTestCase.assertFormError()
ochassertFormsetError()
har nu stöd för att skicka ett formulär/formset-objekt direkt.
URL:er¶
Det nya attributet
ResolverMatch.captured_kwargs
lagrar de nyckelordsargument som fångats upp, såsom de tolkats från URL:en.Det nya attributet
ResolverMatch.extra_kwargs
lagrar de ytterligare nyckelordsargument som skickas till vyfunktionen.
Verktyg¶
SimpleLazyObject
stöder nu additionsoperationer.mark_safe()
bevarar nu lata objekt.
Validerare¶
Den nya
StepValueValidator
kontrollerar om ett värde är en integrerad multipel av en given stegstorlek. Denna nya validator används för det nyastep_size
-argumentet som läggs till i formulärfält som representerar numeriska värden.
Bakåtkompatibla ändringar i 4.1¶
Databas backend API¶
I det här avsnittet beskrivs ändringar som kan behövas i tredjeparts databasbackends.
BaseDatabaseFeatures.has_case_insensitive_like
ändras frånTrue
tillFalse
för att återspegla beteendet hos de flesta databaser.DatabaseIntrospection.get_key_columns()
har tagits bort. AnvändDatabaseIntrospection.get_relations()
istället.metoden
DatabaseOperations.ignore_conflicts_suffix_sql()
ersätts avDatabaseOperations.on_conflict_suffix_sql()
som accepterar argumentenfields
,on_conflict
,update_fields
ochunique_fields
.Argumentet
ignore_conflicts
i metodenDatabaseOperations.insert_statement()
ersätts avon_conflict
som accepterardjango.db.models.constants.OnConflict
.DatabaseOperations._convert_field_to_tz()
ersätts avDatabaseOperations._convert_sql_to_tz()
som accepterar argumentensql
,params
ochtzname
.Flera datum- och tidsmetoder i
DatabaseOperations
tar nusql
ochparams
argument istället förfield_name
och returnerar 2-tupel som innehåller SQL och parametrarna som ska interpoleras i SQL. De ändrade metoderna har dessa nya signaturer:DatabaseOperations.date_extract_sql(lookup_type, sql, params)
DatabaseOperations.datetime_extract_sql(lookup_type, sql, params, tzname)
DatabaseOperations.time_extract_sql(lookup_type, sql, params)
DatabaseOperations.date_trunc_sql(lookup_type, sql, params, tzname=None)
DatabaseOperations.datetime_trunc_sql(self, lookup_type, sql, params, tzname)
DatabaseOperations.time_trunc_sql(lookup_type, sql, params, tzname=None)
DatabaseOperations.datetime_cast_date_sql(sql, params, tzname)
DatabaseOperations.datetime_cast_time_sql(sql, params, tzname)
django.contrib.gis
¶
Stöd för GDAL 2.1 har tagits bort.
Stöd för PostGIS 2.4 har tagits bort.
Slopat stöd för PostgreSQL 10¶
Uppströmsstöd för PostgreSQL 10 slutar i november 2022. Django 4.1 stöder PostgreSQL 11 och högre.
Borttaget stöd för MariaDB 10.2¶
Uppströmsstöd för MariaDB 10.2 upphör i maj 2022. Django 4.1 stöder MariaDB 10.3 och senare.
Sökningar i administratörens ändringslista som omfattar ändringar i relationer med flera värden¶
Sökningar i adminändringslistan med flera söktermer tillämpas nu i ett enda anrop till filter()
, snarare än i sekventiella filter()
-anrop.
För flervärdesrelationer innebär detta att rader från den relaterade modellen måste matcha alla termer snarare än någon term. Om till exempel search_fields
är inställt på ['child__name', 'child__age']
och en användare söker efter 'Jamal 17'
, kommer rader med föräldrar endast att returneras om det finns en relation till ett 17-årigt barn som heter Jamal, i stället för att även returnera föräldrar som bara har ett yngre eller äldre barn som heter Jamal utöver någon annan 17-åring.
Se ämnet Spänner över flervärdiga relationer för mer diskussion om denna skillnad. I Django 4.0 och tidigare följde get_search_results()
den andra exempelfrågan, men detta odokumenterade beteende ledde till frågor med alltför många sammanfogningar.
Omvända ändringar av främmande nycklar för osparade modellinstanser¶
För att förenhetliga beteendet med många-till-många-relationer för osparade modellinstanser, ger en omvänd främmande nyckel nu upphov till ValueError
när man anropar related managers
för osparade objekt.
Diverse¶
Relaterade hanterare för
ForeignKey
,ManyToManyField
ochGenericRelation
cachelagras nu på denModel
-instans som de tillhör. Denna ändring återställdes i Django 4.1.2.DiscoverRunner
returnerar nu en felkod som inte är noll för oväntade framgångar från tester markerade medunittest.expectedFailure()
.CsrfViewMiddleware
maskerar inte längre CSRF-cookien som den gör med CSRF-token i DOM.CsrfViewMiddleware
använder nurequest.META['CSRF_COOKIE']
för att lagra den omaskerade CSRF-hemligheten istället för en maskerad version. Detta är ett odokumenterat, privat API.Attributen
ModelAdmin.actions
ochinlines
är nu standard för en tom tupel snarare än en tom lista för att motverka oavsiktlig mutation.Attributet
type="text/css"
ingår inte längre i<link>
taggar för CSS form media.javaScript-händelserna
formset:added
ochformset:removed
är nu rena JavaScript-händelser och är inte beroende av jQuery. Se Inline-formulärhändelser för mer detaljer om förändringen.Argumentet
exc_info
i den odokumenterade funktionendjango.utils.log.log_response()
ersätts avexception
.Argumentet
size
i den odokumenterade funktionendjango.views.static.was_modified_since()
har tagits bort.Användargränssnittet för inloggning av administratörer använder nu
POST
-förfrågningar.Den odokumenterade egenskapen
InlineAdminFormSet.non_form_errors
ersätts av metodennon_form_errors()
. Detta är i överensstämmelse medBaseFormSet
.Enligt above, är den cachade mallladdaren nu aktiverad i utveckling. Du kan ange
OPTIONS['loaders']
för att åsidosätta detta, om det behövs.Den odokumenterade mixen
django.contrib.auth.views.SuccessURLAllowedHostsMixin
ersätts avRedirectURLMixin
.BaseConstraint
subclasses måste implementeravalidate()
method för att tillåta att dessa begränsningar används för validering.De odokumenterade
URLResolver._is_callback()
,URLResolver._callback_strs
ochURLPattern.lookup_str()
flyttas tilldjango.contrib.admindocs.utils
.Metoden
Model.full_clean()
konverterar nu ettexclude
-värde till ettset
. Det är också att föredra att skicka ettexclude
-värde som ettset
till metodernaModel.clean_fields()
,Model.full_clean()
,Model.validate_unique()
, ochModel.validate_constraints()
.Den lägsta versionen av
asgiref
som stöds har ökats från 3.4.1 till 3.5.2.Kombinerade uttryck använder inte längre det felbenägna beteendet att gissa
output_field
när argumenttyperna matchar. Som en följd av detta kan upplösningen av ettoutput_field
för databasfunktioner och kombinerade uttryck nu krascha med blandade typer. Du måste uttryckligen angeoutput_field
i sådana fall.Kommandot
makemessages
ändrar inte längre.po
-filer när de är uppdaterade. I äldre versioner uppdaterades alltidPOT-Creation-Date
.
Funktioner som inte längre är aktuella i 4.1¶
Logga ut via GET¶
Utloggning via GET
-förfrågningar till inbyggd utloggningsvy
är föråldrad. Använd POST
förfrågningar istället.
Om du vill behålla användarupplevelsen av en HTML-länk kan du använda ett formulär som är utformat så att det ser ut som en länk:
<form id="logout-form" method="post" action="{% url 'admin:logout' %}">
{% csrf_token %}
<button type="submit">{% translate "Log out" %}</button>
</form>
#logout-form {
display: inline;
}
#logout-form button {
background: none;
border: none;
cursor: pointer;
padding: 0;
text-decoration: underline;
}
Diverse¶
Kontexten för sitemap index mallar av en platt lista över webbadresser är föråldrad. Anpassade sitemap indexmallar bör uppdateras för den justerade context variables, som förväntar sig en lista av objekt med
location
och valfrialastmod
attribut.övergångsinställningen
CSRF_COOKIE_MASKED
är föråldrad.Argumentet
name
idjango.utils.functional.cached_property()
är föråldrat eftersom det är onödigt från och med Python 3.6.Argumentet
opclasses
idjango.contrib.postgres.constraints.ExclusionConstraint
är föråldrat till förmån för användning avOpClass()
iExclusionConstraint.expressions
. För att använda det måste du lägga till'django.contrib.postgres'
i dinINSTALLED_APPS
.När du har gjort den här ändringen kommer
makemigrations
att generera en ny migrering med två åtgärder:RemoveConstraint
ochAddConstraint
. Eftersom denna ändring inte har någon effekt på databasschemat kan operationenSeparateDatabaseAndState
användas för att bara uppdatera migreringstillståndet utan att köra någon SQL. Flytta de genererade operationerna till argumentetstate_operations
iSeparateDatabaseAndState
. Till exempel:class Migration(migrations.Migration): ... operations = [ migrations.SeparateDatabaseAndState( database_operations=[], state_operations=[ migrations.RemoveConstraint(...), migrations.AddConstraint(...), ], ), ]
Den odokumenterade möjligheten att skicka
errors=None
tillSimpleTestCase.assertFormError()
ochassertFormsetError()
är föråldrad. Använderrors=[]
istället.django.contrib.sessions.serializers.PickleSerializer
är föråldrad på grund av risken för exekvering av fjärrkod.Användningen av
QuerySet.iterator()
på en queryset som hämtar relaterade objekt utan att ange argumentetchunk_size
är föråldrad. I äldre versioner gjordes ingen förhämtning. Om man anger ett värde förchunk_size
innebär det att man vill ha den extra fråga per chunk som behövs för att göra prefetch.Att skicka osparade modellinstanser till relaterade filter är föråldrat. I Django 5.0 kommer undantaget att tas upp.
created=True
läggs till i signaturen förRemoteUserBackend.configure_user()
. Stöd för subklasser avRemoteUserBackend
som inte accepterar detta argument är föråldrat.Aliaset
django.utils.timezone.utc
tilldatetime.timezone.utc`
är föråldrat. Använddatetime.timezone.utc
direkt.Att skicka ett svarsobjekt och ett namn på formulär/formset till
SimpleTestCase.assertFormError()
ochassertFormsetError()
är föråldrat. Använd:assertFormError(response.context["form_name"], ...) assertFormsetError(response.context["formset_name"], ...)
eller skicka formuläret/formset-objektet direkt istället.
Den odokumenterade
django.contrib.gis.admin.OpenLayersWidget
är föråldrad.django.contrib.auth.hashers.CryptPasswordHasher
är föråldrad.Möjligheten att skicka
nulls_first=False
ellernulls_last=False
till metodernaExpression.asc()
ochExpression.desc()
och uttrycketOrderBy
är föråldrad. AnvändNone
istället.Mallarna
"django/forms/default.html"
och"django/forms/formsets/default.html"
som är en proxy till de tabellbaserade mallarna är föråldrade. Använd den specifika mallen istället.Den odokumenterade metoden
LogoutView.get_next_page()
har bytt namn tillget_success_url()
.
Funktioner borttagna i 4.1¶
Dessa funktioner har nått slutet av sin utfasningscykel och tas bort i Django 4.1.
Se Funktioner som inte längre är aktuella i 3.2 för detaljer om dessa ändringar, inklusive hur man tar bort användningen av dessa funktioner.
Stöd för att tilldela objekt som inte stöder skapande av djupa kopior med
copy.deepcopy()
till klassattribut iTestCase.setUpTestData()
har tagits bort.Stöd för att använda ett boolean-värde i
BaseCommand.requires_system_checks
har tagits bort.Argumentet
whitelist
och attributetdomain_whitelist
idjango.core.validators.EmailValidator
har tagits bort.Programkonfigurationsvariabeln
default_app_config
tas bort.TransactionTestCase.assertQuerysetEqual()
anropar inte längrerepr()
på en queryset när den jämförs med strängvärden.Backend
django.core.cache.backends.memcached.MemcachedCache
har tagits bort.Stöd för formatet före Django 3.2 för meddelanden som används av
django.contrib.messages.storage.cookie.CookieStorage
tas bort.