# Django 5.2.8 documentation

# Django 3.2 versionsinformation

6 april 2021

Välkommen till Django 3.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 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 `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 nu `ForeignKey.to_field` och `ForeignKey.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` till `False` 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` och `parallelism` ökas till 102.400 respektive 8 för att matcha `argon2-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ör `generic_inlineformset_factory()` gör det möjligt att anpassa det maximala antalet formulär som kan instansieras när man tillhandahåller `POST`-data. Se Begränsning av det maximala antalet instansierade formulär för mer information.

- Det nya argumentet `can_delete_extra` för `generic_inlineformset_factory()` gör det möjligt att ta bort möjligheten att ta bort extra formulär. Se `can_delete_extra` för mer information.

#### `django.contrib.gis`

- Metoden `GDALRaster.transform()` stöder nu `SpatialReference`.

- Klassen `DataSource` har nu stöd för `pathlib.Path`.

- Klassen `LayerMapping` stöder nu `pathlib.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` och `RemoveCollation`-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` och `x_default` gör det möjligt att generera alternativ till lokaliserade versioner av dina sidor.

#### `django.contrib.syndication`

- Den nya `item_comments`-hook gör det möjligt att ange en URL för kommentarer per feed-objekt.

#### 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` och `django_test_expected_failures`.

#### Dekoratörer

- Den nya `no_append_slash()`-dekoratorn gör att enskilda vyer kan uteslutas från `APPEND_SLASH` URL-normalisering.

#### Felrapportering

- Anpassade `ExceptionReporter`-underklasser kan nu definiera egenskaperna `html_template_path` och `text_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ör `formset_factory()`, `inlineformset_factory()` och `modelformset_factory()` gör det möjligt att anpassa det maximala antalet formulär som kan instansieras när man levererar `POST`-data. Se Begränsning av det maximala antalet instansierade formulär för mer information.

- Det nya argumentet `can_delete_extra` för `formset_factory()`, `inlineformset_factory()` och `modelformset_factory()` gör det möjligt att ta bort möjligheten att radera extra formulär. Se `can_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 argumentet `error_messages` med nyckeln `'missing_management_form'` när du instansierar formsetet.

#### Generiska åsikter

- Attributen `week_format` i `WeekMixin` och `WeekArchiveView` 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 formaten `bz2`, `gz`, `lzma` eller `xz`.

- `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` och `os.PathLike`-instanser.

#### Modeller

- The new `no_key` parameter for `QuerySet.select_for_update()`, supported on PostgreSQL, allows acquiring weaker locks that don’t block the creation of rows that reference locked rows through a foreign key.

- `When()` uttrycket tillåter nu användning av `condition` argumentet med `lookups`.

- De nya attributen `Index.include` och `UniqueConstraint.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 nu `order_by()`-klausulen på MySQL och MariaDB.

- `FilteredRelation()` stöder nu nästlade relationer.

- The `of` argument of `QuerySet.select_for_update()` is now allowed on MySQL 8.0.1+.

- `Value()` expression now automatically resolves its `output_field` to the appropriate `Field` subclass based on the type of its provided `value` for `bool`, `bytes`, `float`, `int`, `str`, `datetime.date`, `datetime.datetime`, `datetime.time`, `datetime.timedelta`, `decimal.Decimal`, and `uuid.UUID` instances. As a consequence, resolving an `output_field` for database functions and combined expressions may now crash with mixed types when using `Value()`. You will need to explicitly set the `output_field` in such cases.

- 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.

- The `field_name` argument of `QuerySet.in_bulk()` now accepts distinct fields if there’s only one field specified in `QuerySet.distinct()`.

- Den nya parametern `tzinfo` i databasfunktionerna `TruncDate` och `TruncTime` gör det möjligt att trunkera datatider i en specifik tidszon.

- Det nya argumentet `db_collation` för `CharField` och `TextField` 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ör `atomic()` 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 ett `RuntimeError`.

- 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ör `HttpResponse`-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` i `HttpResponse`, `SimpleTemplateResponse` och `TemplateResponse` gör det möjligt att ställa in svar `headers` 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 av `configure()` utan att tillhandahålla en giltig `SECRET_KEY` och sedan fortsätta att komma åt `settings.SECRET_KEY` nu att ge upphov till ett `ImproperlyConfigured` undantag.

- De nya metoderna `Signer.sign_object()` och `Signer.unsign_object()` gör det möjligt att signera komplexa datastrukturer. Se Skydd av komplexa datastrukturer för mer information.

  Dessutom blir `signing.dumps()` och `loads()` genvägar för `TimestampSigner.sign_object()` och `unsign_object()`.

#### Serialisering

- Den nya serialiseraren JSONL gör det möjligt att använda formatet JSON Lines med `dumpdata` och `loaddata`. Detta kan vara användbart för att fylla stora databaser eftersom data laddas rad för rad i minnet, i stället för att laddas på en gång.

#### Signaler

- `Signal.send_robust()` loggar nu undantag.

#### Mallar

- `floatformat` mallfilter tillåter nu användning av suffixet `g` för att tvinga fram gruppering med `THOUSAND_SEPARATOR` för den aktiva locale.

- Mallar som cachats med Cached template loaders laddas nu om korrekt under utveckling.

#### Tester

- Objects assigned to class attributes in `TestCase.setUpTestData()` are now isolated for each test method. Such objects are now required to support creating deep copies with `copy.deepcopy()`. Assigning objects which don’t support `deepcopy()` is deprecated and will be removed in Django 4.1.

- `DiscoverRunner` now enables `faulthandler` by default. This can be disabled by using the `test --no-faulthandler` option.

- `DiscoverRunner` och hanteringskommandot `test` kan nu spåra tidpunkter, inklusive databasinstallation och total körtid. Detta kan aktiveras genom att använda alternativet `test --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 till `transaction.on_commit()` i en lista. Detta gör att du kan testa sådana callbacks utan att använda den långsammare `TransactionTestCase`.

- `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 argumentet `transform` används.

#### Verktyg

- Den nya parametern `depth` i funktionerna `django.utils.timesince.timesince()` och `django.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 uppkommet `ValidationError`. Detta gör att anpassade felmeddelanden kan använda platshållaren `%(value)s`.

- Jämlikhetsoperatorn `ValidationError` ignorerar nu ordningsföljden för `messages` och `params`.

## 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 du `DatabaseFeatures.supports_covering_indexes` till `True`.

- Tredjeparts databasbackends måste implementera stöd för kolumndatabaskollationer på `CharField` och `TextField` eller sätta `DatabaseFeatures.supports_collation_on_charfield` och `DatabaseFeatures.supports_collation_on_textfield` till `False`. Om icke-deterministiska kollationer inte stöds, sätt `upports_non_deterministic_collations` till `False`.

- `DatabaseOperations.random_function_sql()` tas bort till förmån för den nya `Random` databasfunktionen.

- `DatabaseOperations.date_trunc_sql()` och `DatabaseOperations.time_trunc_sql()` tar nu det valfria argumentet `tzname` 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ån `DatabaseClient.settings_to_cmd_args_env()`-metoden. Tredjeparts databasbackends måste implementera `DatabaseClient.settings_to_cmd_args_env()` eller åsidosätta `DatabaseClient.runshell()`.

- Tredjeparts databasbackends måste implementera stöd för funktionella index (`Index.expressions`) eller ange `DatabaseFeatures.supports_expression_indexes` till `False`. Om `COLLATE` inte är en del av `CREATE INDEX`-satsen, sätt `DatabaseFeatures.collate_as_index_expression` till `True`.

### `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` till `False`, 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 till `proj_version()`.

- `slugify()` tar nu bort ledande och efterföljande bindestreck och understreck.

- Mallfiltren `intcomma` och `intword` är inte längre beroende av inställningen `USE_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 en `apps.py`-undermodul, använder Django nu denna konfiguration automatiskt, även om den inte är aktiverad med `default_app_config`. Ställ in `default = False` i underklassen `AppConfig` 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änd `urllib.parse.parse_qsl()` istället.

- `django.test.utils.TestContextDecorator` now uses `addCleanup()` so that cleanups registered in the `setUp()` method are called before `TestContextDecorator.disable()`.

- `SessionMiddleware` ger nu upphov till ett `SessionInterrupted`-undantag istället för `SuspiciousOperation` 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 nu `False` om filen inte kan låsas, istället för att ge upphov till `BlockingIOError`.

- 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 alternativet `makemessages --locale`, när de innehåller bindestreck (`'-'`).

- Formulärfältet `django.contrib.auth.forms.ReadOnlyPasswordHashField` är nu `disabled`` som standard. Därför krävs inte längre att `UserChangeForm.clean_password()` returnerar det ursprungliga värdet.

- Cache-operationerna `cache.get_many()`, `get_or_set()`, `has_key()`, `incr()`, `decr()`, `incr_version()` och `decr_version()` hanterar nu korrekt `None` 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åldrade `MemcachedCache`-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

- Assigning objects which don’t support creating deep copies with `copy.deepcopy()` to class attributes in `TestCase.setUpTestData()` is deprecated.

- Att använda ett booleanskt värde i `BaseCommand.requires_system_checks` är föråldrat. Använd `'__all__'` istället för `True`, och `[]` (en tom lista) istället för `False`.

- Argumentet `whitelist` och attributet `domain_whitelist` i `EmailValidator` är föråldrade. Använd `allowlist` istället för `whitelist`, och `domain_allowlist` istället för `domain_whitelist`. Du kan behöva byta namn på `whitelist` i befintliga migreringar.

- Applikationskonfigurationsvariabeln `default_app_config` är utdaterad, på grund av den nu automatiska `AppConfig`-upptäckten. Se Vad är nytt i Django 3.2 för mer information.

- Att automatiskt anropa `repr()` på en queryset i `TransactionTestCase.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 in `transform` till `repr`.

- Backend `django.core.cache.backends.memcached.MemcachedCache` är föråldrad eftersom `python-memcached` har vissa problem och verkar vara ounderhållen. Använd `django.core.cache.backends.memcached.PyMemcacheCache` eller `django.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.