# Django 5.2.8 documentation

# Django 3.1 versionsinformation

4 augusti 2020

Välkommen till Django 3.1!

Dessa versionsinformation täcker de nya funktionerna, samt några bakåtkompatibla förändringar som du vill vara medveten om när du uppgraderar från Django 3.0 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.1 stöder Python 3.6, 3.7, 3.8 och 3.9 (från och med 3.1.3). Vi rekommenderar starkt och stöder endast officiellt den senaste versionen av varje serie.

## Vad är nytt i Django 3.1

### Asynkrona vyer och stöd för middleware

Django stöder nu en helt asynkron sökväg, inklusive:

- Asynkrona vyer

- Asynkrona mellanprogram

- Asynkrona tester och testklient

För att komma igång med asynkrona vyer måste du deklarera en vy med hjälp av `async def`:

    async def my_view(request):
        await asyncio.sleep(0.5)
        return HttpResponse("Hello, async world!")

Alla asynkrona funktioner stöds oavsett om du kör i WSGI- eller ASGI-läge. Det blir dock prestandaförluster om du använder asynkron kod i WSGI-läge. Du kan läsa mer om detaljerna i dokumentationen Asynkront stöd.

Det står dig fritt att blanda asynkrona och synkroniserade vyer, middleware och tester så mycket du vill. Django kommer att se till att du alltid hamnar i rätt exekveringskontext. Vi förväntar oss att de flesta projekt kommer att hålla majoriteten av sina vyer synkrona och bara ha ett fåtal utvalda som körs i async-läge - men det är helt ditt val.

Djangos ORM, cache-lager och andra delar av koden som gör långvariga nätverksanrop har ännu inte stöd för asynkron åtkomst. Vi förväntar oss att lägga till stöd för dem i kommande utgåvor. Asynkrona vyer är idealiska, men om du gör många API- eller HTTP-anrop i din vy kan du nu göra alla dessa HTTP-anrop parallellt för att avsevärt påskynda vyns exekvering.

Asynkront stöd bör vara helt bakåtkompatibelt och vi har försökt se till att det inte har några hastighetsregressioner för din befintliga synkrona kod. Det bör inte ha någon märkbar effekt på några befintliga Django-projekt.

### JSONField för alla stödda databasbackends

Django innehåller nu `models.JSONField` och `forms.JSONField` som kan användas på alla stödda databasbackends. Båda fälten stöder användningen av anpassade JSON-kodare och -avkodare. Modellfältet stöder introspektion, lookups och transformationer som tidigare endast var PostgreSQL:

    from django.db import models

    class ContactInfo(models.Model):
        data = models.JSONField()

    ContactInfo.objects.create(
        data={
            "name": "John",
            "cities": ["London", "Cambridge"],
            "pets": {"dogs": ["Rufus", "Meg"]},
        }
    )
    ContactInfo.objects.filter(
        data__name="John",
        data__pets__has_key="dogs",
        data__cities__contains="London",
    ).delete()

Om ditt projekt använder `django.contrib.postgres.fields.JSONField`, plus relaterade formulärfält och transformationer, bör du anpassa dig för att använda de nya fälten och generera och tillämpa en databasmigrering. För närvarande finns de gamla fälten och transformationerna kvar som en referens till de nya och är deprecated as of this release.

### `DEFAULT_HASHING_ALGORITHM` inställningar

Den nya övergångsinställningen `DEFAULT_HASHING_ALGORITHM` gör det möjligt att ange standardhashingalgoritmen som ska användas för kodning av cookies, lösenordsåterställningstoken på administratörssidan, användarsessioner och signaturer som skapats av `django.core.signing.Signer` och `django.core.signing.dumps()`.

Stöd för SHA-256 lades till i Django 3.1. Om du uppgraderar flera instanser av samma projekt till Django 3.1 bör du ställa in `DEFAULT_HASHING_ALGORITHM` till `'sha1'` under övergången, för att möjliggöra kompatibilitet med de äldre versionerna av Django. Observera att detta kräver Django 3.1.1+. När övergången till 3.1 är klar kan du sluta åsidosätta `DEFAULT_HASHING_ALGORITHM`.

Den här inställningen är inte aktuell från och med den här utgåvan, eftersom stöd för tokens, cookies, sessioner och signaturer som använder SHA-1-algoritmen kommer att tas bort i Django 4.0.

### Mindre funktioner

#### `django.contrib.admin`

- Den nya `django.contrib.admin.EmptyFieldListFilter` för `ModelAdmin.list_filter` tillåter filtrering på tomma värden (tomma strängar och nollor) i admin-ändringslistvyn.

- Filter i det högra sidofältet i vyn för adminändringslistan innehåller nu en länk för att rensa alla filter.

- Administratören har nu ett sidofält på större skärmar för enklare navigering. Det är aktiverat som standard men kan avaktiveras genom att använda en anpassad `AdminSite` och ställa in `AdminSite.enable_nav_sidebar` till `False`.

  Rendering av sidofältet kräver tillgång till den aktuella begäran för att ställa in CSS- och ARIA-rollförmåner. Detta kräver användning av `'django.template.context_processors.request'` i alternativet `'context_processors'` i `OPTIONS`.

- Initialt tomma `extra` inlines kan nu tas bort, på samma sätt som dynamiskt skapade.

- `XRegExp` är uppgraderad från version 2.0.0 till 3.2.0.

- jQuery uppgraderas från version 3.4.1 till 3.5.1.

- Select2-biblioteket har uppgraderats från version 4.0.7 till 4.0.13.

#### `django.contrib.auth`

- Standardantalet iterationer för PBKDF2-lösenordshashen ökas från 180.000 till 216.000.

- Den nya inställningen `PASSWORD_RESET_TIMEOUT` gör det möjligt att definiera antalet sekunder som en länk för återställning av lösenord är giltig. Detta uppmuntras istället för den föråldrade inställningen `PASSWORD_RESET_TIMEOUT_DAYS`, som kommer att tas bort i Django 4.0.

- Mekanismen för återställning av lösenord använder nu hash-algoritmen SHA-256. Stöd för tokens som använder den gamla hash-algoritmen finns kvar till Django 4.0.

- `AbstractBaseUser.get_session_auth_hash()` använder nu SHA-256 hashingalgoritmen. Stöd för användarsessioner som använder den gamla hash-algoritmen finns kvar fram till Django 4.0.

#### `django.contrib.contenttypes`

- Det nya alternativet `remove_stale_contenttypes --include-stale-apps` gör det möjligt att ta bort inaktuella innehållstyper från tidigare installerade appar som har tagits bort från `INSTALLED_APPS`.

#### `django.contrib.gis`

- `relate` lookup stöds nu på MariaDB.

- Lagt till egenskapen `LinearRing.is_counterclockwise`.

- `AsGeoJSON` stöds nu av Oracle.

- Lagt till funktionerna `AsWKB` och `AsWKT`.

- Stöd för PostGIS 3 och GDAL 3 har lagts till.

#### `django.contrib.humanize`

- `intword` mallfilter stöder nu negativa heltal.

#### `django.contrib.postgres`

- Den nya `BloomIndex`-klassen gör det möjligt att skapa `bloom`-index i databasen. Den nya `BloomExtension`-migreringsoperationen installerar `bloom`-tillägget för att lägga till stöd för detta index.

- `get_FOO_display()` stöder nu `ArrayField` och `RangeField`.

- De nya uppslagen `rangefield.lower_inc`, `rangefield.lower_inf`, `rangefield.upper_inc` och `rangefield.upper_inf` gör det möjligt att fråga `RangeField` efter en bunden typ.

- `rangefield.contained_by` stöder nu `SmallAutoField`, `AutoField`, `BigAutoField`, `SmallIntegerField` och `DecimalField`.

- `SearchQuery` stöder nu söktypen `'websearch'` på PostgreSQL 11+.

- `SearchQuery.value` har nu stöd för frågeuttryck.

- Den nya `SearchHeadline`-klassen gör det möjligt att markera sökresultat.

- `search` lookup har nu stöd för frågeuttryck.

- Den nya parametern `cover_density` i `SearchRank` tillåter rangordning efter täckningsdensitet.

- Den nya parametern `normalization` i `SearchRank` tillåter normalisering av rankning.

- Det nya attributet `ExclusionConstraint.deferrable` gör det möjligt att skapa uppskjutbara uteslutningsbegränsningar.

#### `django.contrib.sessions`

- Inställningen `SESSION_COOKIE_SAMESITE` tillåter nu värdet `'None'` (sträng) för att uttryckligen ange att cookien skickas med alla förfrågningar på samma webbplats och mellan olika webbplatser.

#### `django.contrib.staticfiles`

- Inställningen `STATICFILES_DIRS` stöder nu `pathlib.Path`.

#### Cache

- Dekoratorn `cache_control()` och metoden `patch_cache_control()` stöder nu flera fältnamn i direktivet `no-cache` för rubriken `Cache-Control`, enligt RFC 7234 Section 5.2.2.2.

- `delete()` returnerar nu `True` om nyckeln har raderats framgångsrikt, `False` annars.

#### CSRF

- Inställningen `CSRF_COOKIE_SAMESITE` tillåter nu värdet `'None'` (sträng) för att uttryckligen ange att cookien skickas med alla förfrågningar på samma webbplats och mellan olika webbplatser.

#### E-postadress

- Inställningen `EMAIL_FILE_PATH`, som används av file email backend, har nu stöd för `pathlib.Path`.

#### Felrapportering

- `django.views.debug.SafeExceptionReporterFilter` filtrerar nu känsliga värden från `request.META` i undantagsrapporter.

- De nya attributen `SafeExceptionReporterFilter.cleansed_substitute` och `SafeExceptionReporterFilter.hidden_settings` gör det möjligt att anpassa känsliga inställningar och filtrering av `request.META` i undantagsrapporter.

- Den tekniska 404-felsökningsvyn respekterar nu `DEFAULT_EXCEPTION_REPORTER_FILTER` vid tillämpning av inställningsfiltrering.

- Den nya `DEFAULT_EXCEPTION_REPORTER` gör det möjligt att tillhandahålla en `django.views.debug.ExceptionReporter`-underklass för att anpassa genereringen av undantagsrapporter. Se Anpassade felrapporter för detaljer.

#### Fil delning

- metoden `FileSystemStorage.save()` har nu stöd för `pathlib.Path`.

- `FileField` och `ImageField` accepterar nu en callable för `storage`. Detta gör att du kan ändra den använda lagringen vid körning, till exempel genom att välja olika lagring för olika miljöer.

#### Formulär

- `ModelChoiceIterator`, som används av `ModelChoiceField` och `ModelMultipleChoiceField`, använder nu `ModelChoiceIteratorValue` som kan användas av widgets för att komma åt modellinstanser. Se Iteration av relationsval för detaljer.

- `django.forms.DateTimeField` accepterar nu datum i en delmängd av ISO 8601 datetime-format, inklusive valfri tidszon, t.ex. `2019-10-10T06:47`, `2019-10-10T06:47:23+04:00`, eller `2019-10-10T06:47:23Z`. Tidszonen kommer alltid att behållas om den anges, och tidszonmedvetna datatider returneras även om `USE_TZ` är `False`.

  Dessutom använder `DateTimeField` nu `DATE_INPUT_FORMATS` i tillägg till `DATETIME_INPUT_FORMATS` när fältinmatning konverteras till ett `datetime`-värde.

- `MultiWidget.widgets` accepterar nu en ordbok som gör det möjligt att anpassa attribut för subwidgets `namn`.

- Den nya egenskapen `BoundField.widget_type` kan användas för att dynamiskt justera formulärrendering baserat på widget-typen.

#### Internationalisering

- Inställningen `LANGUAGE_COOKIE_SAMESITE` tillåter nu värdet `'None'` (sträng) för att uttryckligen ange att cookien skickas med alla förfrågningar på samma webbplats och mellan olika webbplatser.

- Stöd för och översättningar av algerisk arabiska, igbo, kirgiziska, tadzjikiska och turkmenska har lagts till.

#### Kommandon för hantering

- Det nya alternativet `check --database` gör det möjligt att ange databasalias för att köra systemkontrollerna `database`. Tidigare aktiverades dessa kontroller för alla konfigurerade `DATABASER` genom att skicka taggen `database` till kommandot.

- Det nya alternativet `migrate --check` gör att kommandot avslutas med en status som inte är noll när oanvända migreringar upptäcks.

- Det nya argumentet `returncode` för `CommandError` gör det möjligt att anpassa avslutningsstatusen för hanteringskommandon.

- Det nya alternativet `dbshell -- ARGUMENTS` gör det möjligt att skicka extra argument till kommandoradsklienten för databasen.

- Kommandona `flush` och `sqlflush` innehåller nu SQL för att återställa sekvenser på SQLite.

#### Modeller

- Den nya funktionen `ExtractIsoWeekDay` extraherar ISO-8601-veckodagar från `DateField` och `DateTimeField`, och den nya `iso_week_day` gör det möjligt att söka efter en ISO-8601-veckodag.

- `QuerySet.explain()` stöder nu:

  - `TREE`-format på MySQL 8.0.16+,

  - alternativet `analyze` på MySQL 8.0.18+ och MariaDB.

- Lagt till `PositiveBigIntegerField` som fungerar ungefär som en `PositiveIntegerField` förutom att den bara tillåter värden under en viss (databasberoende) gräns. Värden från `0` till `9223372036854775807` är säkra i alla databaser som stöds av Django.

- Det nya `RESTRICT`-alternativet för `on_delete`-argumentet för `ForeignKey` och `OneToOneField` efterliknar beteendet hos SQL-begränsningen `ON DELETE RESTRICT`.

- `CheckConstraint.check` stöder nu booleska uttryck.

- Metoderna `RelatedManager.add()`, `create()` och `set()` accepterar nu anropsbara objekt som värden i argumentet `through_defaults`.

- Den nya parametern `is_dst` i `QuerySet.datetimes()` bestämmer behandlingen av icke-existerande och tvetydiga datatider.

- Den nya `F` expression `bitxor()` metoden tillåter bitvis XOR operation.

- `QuerySet.bulk_create()` ställer nu in primärnyckeln på objekt när MariaDB 10.5+ används.

- Metoden `DatabaseOperations.sql_flush()` genererar nu mer effektiv SQL på MySQL genom att använda `DELETE` istället för `TRUNCATE`-satser för tabeller som inte kräver återställning av sekvenser.

- SQLite functions are now marked as `deterministic` on Python 3.8+. This allows using them in check constraints and partial indexes.

- Det nya attributet `UniqueConstraint.deferrable` gör det möjligt att skapa uppskjutbara unika begränsningar.

#### Sidindelning

- `Paginator` kan nu itereras över för att få fram dess sidor.

#### Förfrågningar och svar

- Om `ALLOWED_HOSTS` är tom och `DEBUG=True`, tillåts nu subdomäner av localhost i `Host`-huvudet, t.ex. `static.localhost`.

- `HttpResponse.set_cookie()` och `HttpResponse.set_signed_cookie()` tillåter nu användning av `samesite='None'` (sträng) för att uttryckligen ange att cookien skickas med alla förfrågningar på samma webbplats och mellan olika webbplatser.

- Den nya `HttpRequest.accepts()`-metoden returnerar om begäran accepterar den angivna MIME-typen enligt HTTP-headern `Accept`.

#### Säkerhet

- Inställningen `SECURE_REFERRER_POLICY` har nu standardvärdet `'same-origin'`. Med detta konfigurerat ställer `SecurityMiddleware` in Policy för hänvisare-huvudet till `same-origin` på alla svar som inte redan har det. Detta förhindrar att rubriken `Referer` skickas till andra ursprung. Om du behöver det tidigare beteendet, sätt uttryckligen `SECURE_REFERRER_POLICY` till `None`.

- Standardalgoritmen för `django.core.signing.Signer`, `django.core.signing.loads()`, och `django.core.signing.dumps()` ändras till SHA-256. Stöd för signaturer gjorda med den gamla SHA-1-algoritmen finns kvar fram till Django 4.0.

  Den nya parametern `algoritm` i `Signer` gör det också möjligt att anpassa hashingalgoritmen.

#### Mallar

- De omdöpta `translate` och `blocktranslate` malltaggarna introduceras för internationalisering i mallkoden. De äldre malltaggarnas alias `trans` och `blocktrans` fortsätter att fungera och kommer att behållas under överskådlig framtid.

- Malltaggen `include` accepterar nu iterabler av mallnamn.

#### Tester

- `SimpleTestCase` implementerar nu metoden `debug()` som gör det möjligt att köra ett test utan att samla in resultatet och fånga upp undantag. Detta kan användas för att stödja körning av tester under en debugger.

- Den nya inställningen `MIGRATE` för testdatabaser gör det möjligt att inaktivera migreringar under skapandet av en testdatabas.

- `DiscoverRunner` kan nu kassera utdata för godkända tester med hjälp av `test --buffer`.

- `DiscoverRunner` hoppar nu över att köra systemkontrollerna på databaser som inte refereras av tester.

- `TransactionTestCase` teardown är nu snabbare på MySQL på grund av förbättringar av kommandot `flush`. Som en bieffekt återställer det senare inte automatiskt sekvenser vid nedmontering längre. Aktivera `TransactionTestCase.reset_sequences` om dina tester kräver den här funktionen.

#### URL:er

- Path converters kan nu skapa `ValueError` i `to_url()` för att indikera att det inte finns någon matchning när URL:er vänds.

#### Verktyg

- `filepath_to_uri()` stöder nu `pathlib.Path`.

- `parse_duration()` stöder nu kommaseparatorer för decimalfraktioner i ISO 8601-formatet.

- `parse_datetime()`, `parse_duration()` och `parse_time()` stöder nu kommaseparatorer för millisekunder.

#### Diverse

- SQLite-backend har nu stöd för `pathlib.Path` för inställningen `NAME`.

- `settings.py` som genereras av kommandot `startproject` använder nu `pathlib.Path` istället för `os.path` för att bygga filsystemssökvägar.

- Inställningen `TIME_ZONE` är nu tillåten för databaser som stöder tidszoner.

## Bakåtkompatibla ändringar i 3.1

### Databas backend API

I det här avsnittet beskrivs ändringar som kan behövas i tredjeparts databasbackends.

- `DatabaseOperations.fetch_returned_insert_columns()` kräver nu ett ytterligare `returning_params` argument.

- egenskapen `connection.timezone` är nu `'UTC'` som standard, eller `TIME_ZONE` när `USE_TZ` är `True` på databaser som stöder tidszoner. Tidigare var det `None` på databaser som stödjer tidszoner.

- egenskapen `connection._nodb_connection` ändras till metoden `connection._nodb_cursor()` och returnerar nu en kontexthanterare som ger en markör och automatiskt stänger markören och anslutningen när `with`-satsen avslutas.

- `DatabaseClient.runshell()` kräver nu ett ytterligare `parameters` argument som en lista med extra argument att skicka vidare till kommandoradsklienten.

- Det positionella argumentet `sequences` i `DatabaseOperations.sql_flush()` ersätts av det booleska nyckelordsbara argumentet `reset_sequences`. Om `True`, kommer sekvenserna för de avkortade tabellerna att återställas.

- Argumentet `allow_cascade` i `DatabaseOperations.sql_flush()` är nu ett argument som endast innehåller nyckelord.

- Det positionella argumentet `using` i `DatabaseOperations.execute_sql_flush()` har tagits bort. Metoden använder nu databasen i den anropade instansen.

- Tredjeparts databasbackends måste implementera stöd för `JSONField` eller sätta `DatabaseFeatures.supports_json_field` till `False`. Om lagring av primitiver inte stöds, sätt `DatabaseFeatures.supports_primitives_in_json_field` till `False`. Om det finns en sann datatyp för JSON, sätt `DatabaseFeatures.has_native_json_field` till `True`. Om `jsonfield.contains` och `jsonfield.contained_by` inte stöds, sätt `DatabaseFeatures.supports_json_field_contains` till `False`.

- Tredjeparts databasbackends måste implementera introspektion för `JSONField` eller sätta `can_introspect_json_field` till `False`.

### Borttaget stöd för MariaDB 10.1

Uppströmsstöd för MariaDB 10.1 upphör i oktober 2020. Django 3.1 stöder MariaDB 10.2 och senare.

### stöd för webbläsaren `contrib.admin`

Administratören stöder inte längre den äldre webbläsaren Internet Explorer. Se admin FAQ för information om webbläsare som stöds.

### `AbstractUser.first_name <django.contrib.auth.models.User.first_name>`` `max_length` ökad till 150

En migrering för `django.contrib.auth.models.User.first_name` ingår. Om du har en anpassad användarmodell som ärver från `AbstractUser` måste du generera och tillämpa en databasmigrering för din användarmodell.

Om du vill behålla gränsen på 30 tecken för förnamn kan du använda ett anpassat formulär:

    from django import forms
    from django.contrib.auth.forms import UserChangeForm

    class MyUserChangeForm(UserChangeForm):
        first_name = forms.CharField(max_length=30, required=False)

Om du vill behålla denna begränsning i administratören när du redigerar användare, ställ in `UserAdmin.form` för att använda detta formulär:

    from django.contrib.auth.admin import UserAdmin
    from django.contrib.auth.models import User

    class MyUserAdmin(UserAdmin):
        form = MyUserChangeForm

    admin.site.unregister(User)
    admin.site.register(User, MyUserAdmin)

### Diverse

- Cache-nycklarna som används av `cache` och genereras av `make_template_fragment_key()` skiljer sig från de nycklar som genereras av äldre versioner av Django. Efter uppgradering till Django 3.1 kommer den första begäran till ett tidigare cachat mallfragment att vara en cachemiss.

- Logiken bakom beslutet att returnera ett omdirigeringsfallback eller ett 204 HTTP-svar från vyn `set_language()` baseras nu på HTTP-rubriken `Accept` istället för närvaron av HTTP-rubriken `X-Requested-With`.

- Kompatibilitetsimporten av `django.core.exceptions.EmptyResultSet` i `django.db.models.query`, `django.db.models.sql` och `django.db.models.sql.datastructures` tas bort.

- Kompatibilitetsimporten av `django.core.exceptions.FieldDoesNotExist` i `django.db.models.fields` har tagits bort.

- Kompatibilitetsimporten av `django.forms.utils.pretty_name()` och `django.forms.boundfield.BoundField` i `django.forms.forms` tas bort.

- Kompatibilitetsimporten av `Context`, `ContextPopException` och `RequestContext` i `django.template.base` tas bort.

- Kompatibilitetsimporten av `django.contrib.admin.helpers.ACTION_CHECKBOX_NAME` i `django.contrib.admin` har tagits bort.

- Inställningarna `STATIC_URL` och `MEDIA_URL` som är inställda på relativa sökvägar inleds nu med det servertillhandahållna värdet för `SCRIPT_NAME` (eller `/` om det inte är inställt). Denna ändring bör inte påverka inställningar som anges till giltiga webbadresser eller absoluta sökvägar.

- `ConditionalGetMiddleware` lägger inte längre till `ETag`-headern till svar med en tom `content`.

- `django.utils.decorators.classproperty()` decorator is made public and moved to `django.utils.functional.classproperty`.

- `floatformat` mallfilter ger nu ut (positiv) `0` för negativa tal som avrundas till noll.

- `Meta.ordering` och `Meta.unique_together` alternativ på modeller i `django.contrib` moduler som tidigare var tuples är nu listor.

- Admin-kalenderwidgeten hanterar nu tvåsiffriga årtal enligt Open Group Specification, dvs. värden mellan 69 och 99 mappas till föregående århundrade och värden mellan 0 och 68 mappas till innevarande århundrade.

- Format som endast innehåller datum tas bort från standardlistan för `DATETIME_INPUT_FORMATS`.

- Widgeten `FileInput` renderar inte längre med HTML-attributet `required` när initialdata finns.

- Den odokumenterade klassen `django.views.debug.ExceptionReporterFilter` har tagits bort. Enligt dokumentationen för Anpassade felrapporter måste klasser som ska användas med `DEFAULT_EXCEPTION_REPORTER_FILTER` ärva från `django.views.debug.SafeExceptionReporterFilter`.

- Cache-timeouten som anges av `cache_page()`-dekoratorn har nu företräde framför `max-age`-direktivet från `Cache-Control`-rubriken.

- Att tillhandahålla ett icke-lokalt fjärrfält i argumentet `ForeignKey.to_field` ger nu upphov till `FieldError`.

- `SECURE_REFERRER_POLICY` har nu standardvärdet `'same-origin'`. Se Vad är nytt Security-avsnittet ovan för mer information.

- ledningskommandot `check` kör nu systemkontrollerna `databas` endast för databasalias som anges med alternativet `check --database`.

- `migrate` kör nu kommandot `database` systemkontroller endast för en databas som ska migreras.

- Admin CSS-klasserna `row1` och `row2` är borttagna till förmån för pseudoklasserna `:nth-child(odd)` och `:nth-child(even)`.

- Funktionen `make_password()` kräver nu att dess argument är en sträng eller bytes. Andra typer bör uttryckligen kastas till en av dessa.

- Den odokumenterade parametern `version` till funktionen `AsKML` har tagits bort.

- JSON- och YAML-serialisatorer, som används av `dumpdata`, dumpar nu all data med Unicode som standard. Om du behöver det tidigare beteendet, skicka `ensure_ascii=True` till JSON-serialisatorn, eller `allow_unicode=False` till YAML-serialisatorn.

- Den automatiska omladdaren övervakar inte längre ändringar i inbyggda Django-översättningsfiler.

- Den minsta versionen av `mysqlclient` som stöds har ökats från 1.3.13 till 1.4.0.

- De odokumenterade `django.contrib.postgres.forms.InvalidJSONInput` och `django.contrib.postgres.forms.JSONString` flyttas till `django.forms.fields`.

- Den odokumenterade klassen `django.contrib.postgres.fields.jsonb.JsonAdapter` tas bort.

- Taggen `{% localize off %}` och filtret `unlocalize` respekterar inte längre inställningen `DECIMAL_SEPARATOR`.

- Den lägsta versionen av `asgiref` som stöds har ökats från 3.2 till 3.2.10.

- Klassen Media återger nu `<script>`-taggar utan attributet `type` för att följa WHATWG:s rekommendationer.

- `ModelChoiceIterator`, som används av `ModelChoiceField` och `ModelMultipleChoiceField`, ger nu 2-tupelval som innehåller `ModelChoiceIteratorValue`-instanser som det första `value`-elementet i varje val. I de flesta fall är detta en transparent proxy, men om du behöver själva `field`-värdet använder du istället attributet `ModelChoiceIteratorValue.value`.

## Funktioner som inte längre är aktuella i 3.1

### PostgreSQL `JSONField`

`django.contrib.postgres.fields.JSONField` och `django.contrib.postgres.forms.JSONField` är föråldrade till förmån för `models.JSONField` och `forms.JSONField`.

De odokumenterade `django.contrib.postgres.fields.jsonb.KeyTransform` och `django.contrib.postgres.fields.jsonb.KeyTextTransform` är också föråldrade till förmån för transformationerna i `django.db.models.fields.json`.

De nya `JSONField`, `KeyTransform` och `KeyTextTransform` kan användas på alla stödda databasbackends.

### Diverse

- inställningen `PASSWORD_RESET_TIMEOUT_DAYS` är utfasad till förmån för `PASSWORD_RESET_TIMEOUT`.

- Den odokumenterade användningen av `isnull` lookup med icke-booleska värden som höger sida är avskriven, använd `True` eller `False` istället.

- Den knappt dokumenterade undantagsklassen `django.db.models.query_utils.InvalidQuery` är utfasad till förmån för `FieldDoesNotExist` och `FieldError`.

- Ingångspunkten `django-admin.py` är föråldrad till förmån för `django-admin`.

- Metoden `HttpRequest.is_ajax()` är utfasad eftersom den förlitade sig på ett jQuery-specifikt sätt att signalera AJAX-anrop, medan nuvarande användning tenderar att använda JavaScript Fetch API. Beroende på ditt användningsfall kan du antingen skriva din egen AJAX-detekteringsmetod eller använda den nya `HttpRequest.accepts()`-metoden om din kod är beroende av klientens `Accept` HTTP-header.

  Om du skriver din egen AJAX-detekteringsmetod kan `request.is_ajax()` återges exakt som `request.headers.get('x-requested-with') == 'XMLHttpRequest'`.

- Att skicka `None` som det första argumentet till `django.utils.deprecation.MiddlewareMixin.__init__()` är föråldrat.

- Kodningsformatet för cookie-värden som används av `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.0.

- Kodningsformatet för sessioner 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.0.

- Det rent dokumentationsmässiga `providing_args`-argumentet för `Signal` är föråldrat. Om du förlitar dig på detta argument som dokumentation kan du flytta texten till en kodkommentar eller docstring.

- Att anropa `django.utils.crypto.get_random_string()` utan ett `length` argument är föråldrat.

- Meddelandet `list` för `ModelMultipleChoiceField` är utfasat till förmån för `invalid_list`.

- Att skicka råa kolumnaliaser till `QuerySet.order_by()` är föråldrat. Samma resultat kan uppnås genom att skicka aliaser i en `RawSQL` istället i förväg.

- Modellfältet `NullBooleanField` är föråldrat till förmån för `BooleanField(null=True, blank=True)`.

- `django.conf.urls.url()` alias av `django.urls.re_path()` är föråldrat.

- Malltaggarna `{% ifequal %}` och `{% ifnotequal %}` är avförda till förmån för `{% if %}`. `{% if %}` täcker alla användningsfall, men om du behöver fortsätta använda dessa taggar kan de extraheras från Django till en modul och inkluderas som en inbyggd tagg i `'builtins'` alternativ i `OPTIONS`.

- `DEFAULT_HASHING_ALGORITHM` övergångsinställning är föråldrad.

## Funktioner borttagna i 3.1

Dessa funktioner har nått slutet av sin utfasningscykel och tas bort i Django 3.1.

Se Funktioner som inte längre är aktuella i 2.2 för detaljer om dessa ändringar, inklusive hur man tar bort användningen av dessa funktioner.

- `django.utils.timezone.FixedOffset` tas bort.

- `django.core.paginator.QuerySetPaginator` tas bort.

- En modells `Meta.ordering` påverkar inte `GROUP BY`-frågor.

- `django.contrib.postgres.fields.FloatRangeField` och `django.contrib.postgres.forms.FloatRangeField` tas bort.

- Inställningen `FILE_CHARSET` tas bort.

- `django.contrib.staticfiles.storage.CachedStaticFilesStorage` tas bort.

- Metoden `RemoteUserBackend.configure_user()` kräver `request` som det första positionella argumentet.

- Stöd för `SimpleTestCase.allow_database_queries` och `TransactionTestCase.multi_db` har tagits bort.