# Django 5.2.8 documentation

# Django 3.0 versionsinformation

2 december 2019

Välkommen till Django 3.0!

Dessa versionsinformation täcker nya funktioner, samt några bakåtkompatibla ändringar som du vill vara medveten om när du uppgraderar från Django 2.2 eller tidigare. Vi har ta bort några funktioner som har nått slutet av sin utfasningscykel, och vi har startat utfasningsprocessen för några funktioner.

Se guiden Så här uppgraderar du Django till en nyare version om du ska uppdatera ett befintligt projekt.

## Kompatibilitet med Python

Django 3.0 stöder Python 3.6, 3.7, 3.8 och 3.9 (från och med 3.0.11). Vi rekommenderar starkt och stöder endast officiellt den senaste versionen av varje serie.

Django 2.2.x-serien är den sista som stöder Python 3.5.

## Stöd för tredjepartsbibliotek för äldre versioner av Django

Efter lanseringen av Django 3.0 föreslår vi att tredjepartsappförfattare släpper stödet för alla versioner av Django före 2.2. Vid den tidpunkten bör du kunna köra ditt pakets tester med `python -Wd` så att varningar för avskrivning visas. Efter att du har åtgärdat varningarna bör din app vara kompatibel med Django 3.0.

## Vad är nytt i Django 3.0

### Stöd för MariaDB

Django har nu officiellt stöd för MariaDB 10.1 och senare. Se MariaDB notes för mer information.

### ASGI-stöd

Django 3.0 börjar vår resa mot att göra Django helt asynk-kompatibelt genom att ge stöd för att köra som en ASGI-applikation.

Detta är i tillägg till vårt befintliga WSGI-stöd. Django har för avsikt att stödja båda under överskådlig framtid. Async-funktioner kommer dock endast att vara tillgängliga för applikationer som körs under ASGI.

I det här skedet gäller async-stödet endast för den yttre ASGI-applikationen. Internt förblir allting synkront. Asynkrona mellanprogram, vyer etc. stöds ännu inte. Du kan dock använda ASGI middleware runt Djangos applikation, vilket gör att du kan kombinera Django med andra ASGI-ramverk.

Det finns ingen anledning att byta ut dina applikationer om du inte vill börja experimentera med asynkron kod, men vi har dokumentation om att distribuera med ASGI om du vill lära dig mer.

Observera att som en bieffekt av denna ändring är Django nu medveten om asynkrona händelseslingor och kommer att blockera dig när du anropar kod som är markerad som ”async unsafe” - till exempel ORM-operationer - från ett asynkront sammanhang. Om du använde Django från asynkron kod tidigare kan detta utlösa om du gjorde det felaktigt. Om du ser ett `SynchronousOnlyOperation`-fel, undersök sedan din kod noggrant och flytta alla databasoperationer till att vara i en synkron undertråd.

### Undantagsbegränsningar på PostgreSQL

Den nya `ExclusionConstraint`-klassen gör det möjligt att lägga till uteslutningsbegränsningar på PostgreSQL. Begränsningar läggs till i modeller med hjälp av alternativet `Meta.constraints`.

### Filtrera uttryck

Uttryck som ger ut `BooleanField` kan nu användas direkt i `QuerySet`-filter, utan att först behöva annotera och sedan filtrera mot annoteringen.

### Uppräkningar för val av modellfält

Anpassade uppräkningstyper `TextChoices`, `IntegerChoices` och `Choices` är nu tillgängliga som ett sätt att definiera `Field.choices`. typerna `TextChoices` och `IntegerChoices` finns för text- och heltalsfält. Klassen `Choices` gör det möjligt att definiera en kompatibel uppräkning för andra konkreta datatyper. Dessa anpassade uppräkningstyper stöder mänskligt läsbara etiketter som kan översättas och nås via en egenskap på uppräkningen eller dess medlemmar. Se Enumerationstyper för mer information och exempel.

### Mindre funktioner

#### `django.contrib.admin`

- Lagt till stöd för attributet `admin_order_field` på egenskaper i `ModelAdmin.list_display`.

- Den nya metoden `ModelAdmin.get_inlines()` gör det möjligt att ange inlines baserat på begäran eller modellinstansen.

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

- jQuery uppgraderas från version 3.3.1 till 3.4.1.

#### `django.contrib.auth`

- Det nya attributet `reset_url_token` i `PasswordResetConfirmView` gör det möjligt att ange en token-parameter som visas som en komponent i URL:er för återställning av lösenord.

- Lagt till `BaseBackend`-klassen för att underlätta anpassning av autentiseringsbackends.

- Added `get_user_permissions()` method to mirror the existing `get_group_permissions()` method.

- Lagt till HTML-attributet `autocomplete` till widgets för användarnamn, e-post och lösenordsfält i `django.contrib.auth.forms` för bättre interaktion med lösenordshanterare i webbläsare.

- `createsuperuser` återgår nu till miljövariabler för lösenord och obligatoriska fält, när ett motsvarande kommandoradsargument inte anges i icke-interaktivt läge.

- `REQUIRED_FIELDS` stöder nu :class:`~django.db.models.ManyToManyField`s.

- Den nya metoden `UserManager.with_perm()` returnerar användare som har den angivna behörigheten.

- Standardantalet iterationer för PBKDF2-lösenordshashen ökas från 150 000 till 180 000.

#### `django.contrib.gis`

- Tillät MySQL:s spatiala uppslagsfunktioner att arbeta med verkliga geometrier. Tidigare stöd var begränsat till avgränsande rutor.

- Lade till `GeometryDistance`-funktionen, som stöds av PostGIS.

- Lagt till stöd för enheten `furlong` i `Distance`.

- Inställningen `GEOIP_PATH` har nu stöd för `pathlib.Path`.

- Klassen `GeoIP2` accepterar nu `pathlib.Path` `path`.

#### `django.contrib.postgres`

- Den nya `RangeOperators` hjälper till att undvika typfel i SQL-operatorer som kan användas tillsammans med `RangeField`.

- Det nya `RangeBoundary`-uttrycket representerar intervallgränserna.

- De nya klasserna `AddIndexConcurrently` och `RemoveIndexConcurrently` tillåter att skapa och släppa index `CONCURRENTLY` på PostgreSQL.

#### `django.contrib.sessions`

- The new `get_session_cookie_age()` method allows dynamically specifying the session cookie age.

#### `django.contrib.syndication`

- Added the `language` class attribute to the `django.contrib.syndication.views.Feed` to customize a feed language. The default value is `get_language()` instead of `LANGUAGE_CODE`.

#### Cache

- `add_never_cache_headers()` och `never_cache()` lägger nu till direktivet `private` i `Cache-Control`-rubrikerna.

#### Fil delning

- Den nya metoden `Storage.get_alternative_name()` gör det möjligt att anpassa algoritmen för att generera filnamn om det redan finns en fil med det uppladdade namnet.

#### Formulär

- Formsets may control the widget used when ordering forms via `can_order` by setting the `ordering_widget` attribute or overriding `get_ordering_widget`.

#### Internationalisering

- Inställningarna `LANGUAGE_COOKIE_HTTPONLY`, `LANGUAGE_COOKIE_SAMESITE` och `LANGUAGE_COOKIE_SECURE` lades till för att ange flaggorna `HttpOnly`, `SameSite` och `Secure` för språkcookies. Standardvärdena för dessa inställningar bevarar det tidigare beteendet.

- Stöd och översättningar för det uzbekiska språket har lagts till.

#### Loggning

- Den nya parametern `reporter_class` i `AdminEmailHandler`` gör det möjligt att tillhandahålla en `django.views.debug.ExceptionReporter`-underklass för att anpassa spårningstexten som skickas till webbplatsen `ADMINS`` när `DEBUG`` är `False`.

#### Kommandon för hantering

- Det nya alternativet `compilemessages --ignore` gör det möjligt att ignorera specifika kataloger när man söker efter `.po`-filer att kompilera.

- `showmigrations --list` visar nu de tillämpade datumtiderna när `--verbosity` är 2 och högre.

- På PostgreSQL stöder `dbshell` nu TLS-certifikat på klientsidan.

- `inspectdb` introspekterar nu `OneToOneField` när en främmande nyckel har en unik eller primär nyckelbegränsning.

- Det nya `--skip-checks`-alternativet hoppar över systemkontroller innan kommandot körs.

- Alternativen `startapp --template` och `startproject --template` stöder nu mallar som lagras i XZ-arkiv (`.tar.xz`, `.txz`) och LZMA-arkiv (`.tar.lzma`, `.tlz`).

#### Modeller

- Lagt till hashdatabasfunktioner `MD5`, `SHA1`, `SHA224`, `SHA256`, `SHA384`, och `SHA512`.

- Lagt till databasfunktionen `Sign`.

- Den nya parametern `is_dst` i databasfunktionerna `Trunc` bestämmer behandlingen av icke-existerande och tvetydiga datatider.

- `connection.queries` visar nu `COPY ... TO` uttalanden på PostgreSQL.

- `FilePathField` accepterar nu en anropsbar för `path`.

- Tillåten symmetrisk mellantabell för självrefererande `ManyToManyField`.

- Attributen `name` för `CheckConstraint`, `UniqueConstraint` och `Index` stöder nu appetikett- och klassinterpolering med hjälp av platshållarna ``’%(app_label)s` och ``’%(class)s`.

- The new `Field.descriptor_class` attribute allows model fields to customize the get and set behavior by overriding their descriptors.

- `Avg` och `Sum` stöder nu argumentet `distinct`.

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

- `AutoField`, `BigAutoField`, och `SmallAutoField` ärver nu från `IntegerField`, `BigIntegerField` respektive `SmallIntegerField`. Systemkontroller och validatorer ärvs nu också korrekt.

- `FileField.upload_to` stöder nu `pathlib.Path`.

- `CheckConstraint` stöds nu av MySQL 8.0.16+.

- Den nya `allows_group_by_selected_pks_on_model()`-metoden för `django.db.backends.base.BaseDatabaseFeatures` möjliggör optimering av `GROUP BY`-klausuler för att endast kräva de valda modellernas primära nycklar. Som standard stöds det endast för hanterade modeller på PostgreSQL.

  För att aktivera `` GROUP BY`` primär nyckeloptimering för ohanterade modeller måste du underklassa PostgreSQL-databasmotorn och åsidosätta funktionsklassens `allows_group_by_selected_pks_on_model()` metod som du behöver. Se Subclassing the built-in database backends för ett exempel.

#### Förfrågningar och svar

- Tillät `HttpResponse` att initieras med `memoryview` innehåll.

- För användning i t.ex. Django-mallar tillåter `HttpRequest.headers` nu uppslagningar med understreck (t.ex. `user_agent`) i stället för bindestreck.

#### Säkerhet

- `X_FRAME_OPTIONS` är nu standardinställningen `'DENY'`. I äldre versioner är `X_FRAME_OPTIONS` standardinställningen `'SAMEORIGIN'`. Om din webbplats använder ramar av sig själv måste du uttryckligen ställa in `X_FRAME_OPTIONS = 'SAMEORIGIN'` för att de ska fortsätta att fungera.

- `SECURE_CONTENT_TYPE_NOSNIFF` har nu standardvärdet `True`. Med detta aktiverat ställer `SecurityMiddleware` in X-Content-Type-Options: nosniff-huvudet på alla svar som inte redan har det.

- `SecurityMiddleware` kan nu skicka rubriken Referrer-Policy.

#### Tester

- Det nya test `Client`-argumentet `raise_request_exception` gör det möjligt att kontrollera om undantag som uppstår under begäran också ska uppstå i testet eller inte. Värdet är som standard `True` för bakåtkompatibilitet. Om det är `False` och ett undantag inträffar kommer testklienten att returnera ett 500-svar med attributet `exc_info`, en tupel som ger information om det undantag som inträffade.

- Tester och testfall som ska köras kan väljas utifrån ett testnamnsmönster med hjälp av det nya alternativet `test -k`.

- HTML-jämförelse, som används av `assertHTMLEqual()`, behandlar nu text, teckenreferenser och entitetsreferenser som hänvisar till samma tecken som likvärdiga.

- `DiscoverRunner` kan nu skapa en debugger vid varje fel eller misslyckande med hjälp av `test --pdb`.

## Bakåtkompatibla ändringar i 3.0

### `Model.save()` när du tillhandahåller en standard för den primära nyckeln

`Model.save()` försöker inte längre hitta en rad när en ny `Model`-instans sparas och ett standardvärde för primärnyckeln tillhandahålls, och utför alltid en enda `INSERT`-fråga. I äldre Django-versioner utförde `Model.save()` antingen en `INSERT` eller en `UPDATE` baserat på om raden finns eller inte.

Detta gör att anrop av `Model.save()` med ett standardvärde för primärnyckeln motsvarar att skicka force_insert=True till modellens `save()`. Försök att använda en ny `Model`-instans för att uppdatera en befintlig rad kommer att resultera i ett `IntegrityError`.

För att uppdatera en befintlig modell för ett specifikt primärnyckelvärde, använd `update_or_create()`-metoden eller `QuerySet.filter(pk=...).update(...)` istället. Exempel på detta:

    >>> MyModel.objects.update_or_create(pk=existing_pk, defaults={"name": "new name"})
    >>> MyModel.objects.filter(pk=existing_pk).update(name="new name")

### Databas backend API

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

- Det andra argumentet i `DatabaseIntrospection.get_geometry_type()` är nu radbeskrivningen istället för kolumnnamnet.

- `DatabaseIntrospection.get_field_type()` får inte längre returnera tupler.

- Om databasen kan skapa främmande nycklar i samma SQL-sats som lägger till ett fält, lägg till `SchemaEditor.sql_create_column_inline_fk` med lämplig SQL; i annat fall, sätt `DatabaseFeatures.can_create_inline_fk = False`.

- `DatabaseFeatures.can_return_id_from_insert` och `can_return_ids_from_bulk_insert` byter namn till `can_return_columns_from_insert` och `can_return_rows_from_bulk_insert`.

- Databasfunktioner hanterar nu `datetime.timezone`-format när de skapas med `datetime.timedelta`-instanser (t.ex. `timezone(timedelta(hours=5))`, som skulle ge ut `'UTC+05:00'`). Tredjeparts backends bör hantera detta format när de förbereder `DateTimeField` i `datetime_cast_date_sql()`, `datetime_extract_sql()`, etc.

- Poster för `AutoField`, `BigAutoField` och `SmallAutoField` läggs till i `DatabaseOperations.integer_field_ranges` för att stödja validerarna för heltalsintervall för dessa fälttyper. Backends från tredje part kan behöva anpassa standardposterna.

- `DatabaseOperations.fetch_returned_insert_id()` ersätts av `fetch_returned_insert_columns()` som returnerar en lista med värden som returneras av `INSERT ... RETURNING`-satsen, istället för ett enda värde.

- `DatabaseOperations.return_insert_id()` ersätts av `return_insert_columns()` som accepterar ett `fields` argument, vilket är en iterabel av fält som ska returneras efter inmatning. Vanligtvis är detta bara den autogenererade primärnyckeln.

### `django.contrib.admin`

- Admins ändringsmeddelanden för modellhistorik föredrar nu mer läsbara fältetiketter istället för fältnamn.

### `django.contrib.gis`

- Stöd för PostGIS 2.1 har tagits bort.

- Stöd för SpatiaLite 4.1 och 4.2 har tagits bort.

- Stöd för GDAL 1.11 och GEOS 3.4 har tagits bort.

### Tappat stöd för PostgreSQL 9.4

Uppströmsstöd för PostgreSQL 9.4 slutar i december 2019. Django 3.0 stöder PostgreSQL 9.5 och högre.

### Upphört stöd för Oracle 12.1

Uppströmsstöd för Oracle 12.1 upphör i juli 2021. Django 2.2 kommer att stödjas fram till april 2022. Django 3.0 stöder officiellt Oracle 12.2 och 18c.

### Borttagna privata API:er för Python 2-kompatibilitet

Medan Python 2-stödet togs bort i Django 2.0, togs inte vissa privata API: er bort från Django så att tredjepartsappar kunde fortsätta använda dem tills Python 2 var slut.

Eftersom vi förväntar oss att appar tappar Python 2-kompatibiliteten när de lägger till stöd för Django 3.0, tar vi bort dessa API:er just nu.

- `django.test.utils.str_prefix()` - Strängar har inte ’u’-prefix i Python 3.

- `django.test.utils.patch_logger()` - Använd `unittest.TestCase.assertLogs()` istället.

- `django.utils.lru_cache.lru_cache()` - Alias för `functools.lru_cache()`.

- `django.utils.decorators.available_attrs()` - Denna funktion returnerar `functools.WRAPPER_ASSIGNMENTS`.

- `django.utils.decorators.ContextDecorator` - Alias för `contextlib.ContextDecorator`.

- `django.utils._os.abspathu()` - Alias för `os.path.abspath()`.

- `django.utils._os.upath()` och `npath()` - Dessa funktioner gör ingenting på Python 3.

- `django.utils.six` - Ta bort användningen av detta vendored-bibliotek eller byt till six.

- `django.utils.encoding.python_2_unicode_compatible()` - Alias för `six.python_2_unicode_compatible()`.

- `django.utils.functional.curry()` - Använd `functools.partial()` eller `functools.partialmethod`. See 5b1c389603a353625ae1603ba345147356336afb.

- `django.utils.safestring.SafeBytes` - Oanvänd sedan Django 2.0.

### Nytt standardvärde för inställningen `FILE_UPLOAD_PERMISSIONS`

I äldre versioner är standardinställningen för `FILE_UPLOAD_PERMISSIONS` `None`. Med standardinställningen `FILE_UPLOAD_HANDLERS` resulterar detta i att uppladdade filer har olika behörigheter beroende på storlek och vilken uppladdningshanterare som används.

`FILE_UPLOAD_PERMISSIONS` har nu standardvärdet `0o644` för att undvika denna inkonsekvens.

### Nya standardvärden för säkerhetsinställningar

För att göra Django-projekt säkrare som standard har vissa säkerhetsinställningar nu säkrare standardvärden:

- `X_FRAME_OPTIONS` är nu standardvärdet `'DENY'`.

- `SECURE_CONTENT_TYPE_NOSNIFF` är nu standardvärdet `True`.

Se Vad är nytt Säkerhetsavsnittet ovan för mer information om dessa ändringar.

### Diverse

- `ContentType.__str__()` inkluderar nu modellens `app_label` för att särskilja modeller med samma namn i olika appar.

- Eftersom åtkomst till språket i sessionen snarare än i cookien är föråldrad, letar `LocaleMiddleware` inte längre efter användarens språk i sessionen och `django.contrib.auth.logout()` bevarar inte längre sessionens språk efter utloggning.

- `django.utils.html.escape()` använder nu `html.escape()` för att escapa HTML. Detta konverterar `'` till `&#x27;` istället för den tidigare motsvarande decimalkoden `'`.

- Alternativet `django-admin test -k` fungerar nu som alternativet `unittest -k` snarare än som en genväg för `--keepdb`.

- Stöd för `pywatchman` < 1.2.0 har tagits bort.

- `urlencode()` kodar nu itererbara värden som de är när `doseq=False`, snarare än att iterera dem, vilket gör att den är i linje med standardbibliotekets `urllib.parse.urlencode()`-funktion.

- mallfiltret `intword` översätter nu `1.0` som en singularfras och alla andra numeriska värden som plural. Detta kan vara felaktigt för vissa språk.

- Tilldelning av ett värde till en modells `ForeignKey` eller `OneToOneField` `'_id'` attribut avaktiverar nu motsvarande fält. Att komma åt fältet efteråt kommer att resultera i en fråga.

- `patch_vary_headers()` hanterar nu en asterisk `'*'` enligt RFC 7231 Section 7.1.4, dvs. om en lista med namn på rubrikfält innehåller en asterisk, så kommer rubriken `Vary` att bestå av en enda asterisk `'*'`.

- I MySQL 8.0.16+ inkluderar `PositiveIntegerField` och `PositiveSmallIntegerField` nu en kontrollbegränsning för att förhindra negativa värden i databasen.

- `alias=None` läggs till i signaturen för `Expression.get_group_by_cols()`.

- `RegexPattern`, som används av `re_path()`, returnerar inte längre nyckelordsargument med `None`-värden som ska skickas till vyn för de valfria namngivna grupper som saknas.

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

### `django.utils.encoding.force_text()` och `smart_text()`

Aliasen `smart_text()` och `force_text()` (sedan Django 2.0) för `smart_str()` och `force_str()` är föråldrade. Ignorera denna föråldring om din kod stöder Python 2 eftersom beteendet för `smart_str()` och `force_str()` är annorlunda där.

### Diverse

- `django.utils.http.urlquote()`, `urlquote_plus()`, `urlunquote()` och `urlunquote_plus()` är avförda till förmån för de funktioner som de är alias för: `urllib.parse.quote()`, `quote_plus()`, `unquote()`, och `unquote_plus()`.

- `django.utils.translation.ugettext()`, `ugettext_lazy()`, `ugettext_noop()`, `ungettext()` och `ungettext_lazy()` är avförda till förmån för de funktioner som de är alias för: `django.utils.translation.gettext()`, `gettext_lazy()`, `gettext_noop()`, `ngettext()` och `ngettext_lazy()`.

- För att begränsa skapandet av sessioner och därmed gynna vissa cachningsstrategier kommer `django.views.i18n.set_language()` att sluta ställa in användarens språk i sessionen i Django 4.0. Sedan Django 2.1 lagras språket alltid i `LANGUAGE_COOKIE_NAME`-cookien.

- `django.utils.text.unescape_entities()` är utfasad till förmån för `html.unescape()`. Observera att till skillnad från `unescape_entities()`, utvärderar `html.unescape()` lata strängar omedelbart.

- För att undvika eventuell förvirring vad gäller effektiv räckvidd har det privata interna verktyget `is_safe_url()` bytt namn till `url_has_allowed_host_and_scheme()`. Att en URL har en tillåten värd och ett tillåtet schema innebär i allmänhet inte att den är ”säker”. Den kan fortfarande citeras felaktigt, till exempel. Se till att även använda `iri_to_uri()` på sökvägskomponenten i opålitliga URL:er.

## Funktioner borttagna i 3.0

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

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

- Modulen `django.db.backends.postgresql_psycopg2` tas bort.

- `django.shortcuts.render_to_response()` har tagits bort.

- Inställningen `DEFAULT_CONTENT_TYPE` tas bort.

- `HttpRequest.xreadlines()` har tagits bort.

- Stöd för argumentet `context` i `Field.from_db_value()` och `Expression.convert_value()` har tagits bort.

- Nyckelordsargumentet `field_name` i `QuerySet.earliest()` och `latest()` har tagits bort.

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

- GIS-funktionen `ForceRHR` har tagits bort.

- `django.utils.http.cookie_date()` har tagits bort.

- Malltaggbiblioteken `staticfiles` och `admin_static` har tagits bort.

- `django.contrib.staticfiles.templatetags.staticfiles.static()` tas bort.