# Django 5.2.8 documentation

# Django 2.2 versionsinformation

1 april 2019

Välkommen till Django 2.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 2.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 2.2 betecknas som en long-term support release. Den kommer att få säkerhetsuppdateringar i minst tre år efter att den släppts. Stöd för den tidigare LTS, Django 1.11, kommer att upphöra i april 2020.

## Kompatibilitet med Python

Django 2.2 stöder Python 3.5, 3.6, 3.7, 3.8 (från och med 2.2.8) och 3.9 (från och med 2.2.17). Vi rekommenderar starkt och stöder endast officiellt den senaste utgåvan av varje serie.

## Vad är nytt i Django 2.2

### Begränsningar

De nya klasserna `CheckConstraint` och `UniqueConstraint` gör det möjligt att lägga till anpassade databasbegränsningar. Begränsningar läggs till i modeller med hjälp av alternativet `Meta.constraints`.

### Mindre funktioner

#### `django.contrib.admin`

- Lade till en CSS-klass till kolumnrubrikerna i `TabularInline`.

#### `django.contrib.auth`

- `HttpRequest` skickas nu som det första positionella argumentet till `RemoteUserBackend.configure_user()`, om det accepteras.

#### `django.contrib.gis`

- Lagt till Oracle-stöd för funktionen `Envelope`.

- SpatiaLite-stöd har lagts till för uppslagen `coveredby` och `covers`.

#### `django.contrib.postgres`

- Det nya argumentet `ordering` för `ArrayAgg` och `StringAgg` bestämmer ordningen på de aggregerade elementen.

- De nya klasserna `BTreeIndex`, `HashIndex` och `SpGistIndex` gör det möjligt att skapa `B-Tree`, `hash` och `SP-GiST` index i databasen.

- `BrinIndex` har nu parametern `autosummarize`.

- Den nya parametern `search_type` i `SearchQuery` gör det möjligt att söka efter en fras eller ett rått uttryck.

#### `django.contrib.staticfiles`

- Lagt till sökvägsmatchning till `collectstatic --ignore`-alternativet så att mönster som `/vendor/*.js` kan användas.

#### Databas backends

- Lagt till resultatströmning för `QuerySet.iterator()` på SQLite.

#### Generiska åsikter

- Den nya `View.setup`-hook initialiserar vyattribut innan den anropar `dispatch()`. Det gör det möjligt för mixins att ställa in instansattribut för återanvändning i underordnade klasser.

#### Internationalisering

- Stöd och översättningar för armeniska har lagts till.

#### Kommandon för hantering

- Det nya alternativet `--force-color` tvingar fram färgläggning av kommandoutmatningen.

- `inspectdb` skapar nu modeller för utländska tabeller på PostgreSQL.

- `inspectdb --include-views` skapar nu modeller för materialiserade vyer på Oracle och PostgreSQL.

- Det nya alternativet: inspectdb –include-partitions-alternativet gör det möjligt att skapa modeller för partitionstabeller på PostgreSQL. I äldre versioner skapas modeller barntabeller istället för föräldern.

- `inspectdb` introspekterar nu `DurationField` för Oracle och PostgreSQL, och `AutoField` för SQLite.

- På Oracle paketeras `dbshell` med `rlwrap`, om det finns tillgängligt. `rlwrap` ger en kommandohistorik och redigering av tangentbordsinmatning.

- Det nya alternativet `makemigrations --no-header` undviker att skriva huvudkommentarer i genererade migreringsfiler. Detta alternativ är också tillgängligt för `squashmigrations`.

- `runserver` kan nu använda Watchman för att förbättra prestandan vid bevakning av ett stort antal filer med avseende på ändringar.

#### Migreringar

- Det nya alternativet `migrate --plan` skriver ut en lista över de migreringsåtgärder som ska utföras.

- `NoneType` kan nu serialiseras i migreringar.

- Du kan nu registrera anpassade serializers för migreringar.

#### Modeller

- Lagt till stöd för PostgreSQL-operatörsklasser (`Index.opclasses`).

- Lagt till stöd för partiella index (`Index.condition`).

- Lagt till databasfunktionerna `NullIf` och `Reverse`, samt många math databasfunktioner.

- Genom att ställa in den nya parametern `ignore_conflicts` i `QuerySet.bulk_create()` till `True` får databasen veta att den ska ignorera misslyckanden med att infoga rader som inte uppfyller unikhetsbegränsningar eller andra kontroller.

- Den nya funktionen `ExtractIsoYear` extraherar ISO-8601 veckonummererade år från `DateField` och `DateTimeField`, och den nya `iso_year` gör det möjligt att ställa frågor om ett ISO-8601 veckonummererat år.

- Den nya metoden `QuerySet.bulk_update()` gör det möjligt att effektivt uppdatera specifika fält i flera modellinstanser.

- Django startar inte längre alltid en transaktion när en enda fråga utförs, till exempel `Model.save()`, `QuerySet.update()` och `Model.delete()`. Detta förbättrar prestandan för autocommit genom att minska antalet rundresor i databasen.

- Lagt till SQLite-stöd för funktionerna `StdDev` och `Variance`.

- Hanteringen av `DISTINCT`-aggregering läggs till i klassen `Aggregate``. Genom att lägga till `allow_distinct = True` som ett klassattribut på `Aggregate` subklasser kan ett `distinct` nyckelordsargument anges vid initialisering för att säkerställa att aggregatfunktionen endast anropas för varje distinkt värde av `expressions`.

- Metoderna `RelatedManager.add()`, `create()`, `remove()`, `set()`, `get_or_create()` och `update_or_create()` är nu tillåtna för många-till-många-relationer med mellanliggande modeller. Det nya argumentet `through_defaults` används för att ange värden för nya mellanliggande modellinstanser.

#### Förfrågningar och svar

- Lagt till `HttpRequest.headers` för att ge enkel åtkomst till en requests headers.

#### Serialisering

- Du kan nu deserialisera data med hjälp av naturliga nycklar som innehåller forward references genom att skicka `handle_forward_references=True` till `serializers.deserialize()`. Dessutom hanterar `loaddata` framåtriktade referenser automatiskt.

#### Tester

- Det nya `SimpleTestCase.assertURLEqual()`-testet kontrollerar en given URL och ignorerar ordningsföljden på frågesträngen. `assertRedirects()` använder det nya testet.

- Test `Client` har nu stöd för automatisk JSON-serialisering av list- och tuple-data när `content_type='application/json'`.

- Den nya `ORACLE_MANAGED_FILES` testdatabasinställning tillåter användning av Oracle Managed Files (OMF) tablespaces.

- Deferrable database constraints kontrolleras nu i slutet av varje `TestCase`-test på SQLite 3.20+, precis som på andra backends som stöder deferrable constraints. Dessa kontroller är inte implementerade för äldre versioner av SQLite eftersom de skulle kräva dyr tabellintrospektion där.

- `DiscoverRunner` hoppar nu över installationen av databaser som inte refereras av tester.

#### URL:er

- Det nya attributet `ResolverMatch.route` lagrar rutten för det matchande URL-mönstret.

#### Validerare

- `MaxValueValidator`, `MinValueValidator`, `MinLengthValidator` och `MaxLengthValidator` accepterar nu en anropbar `limit_value`.

## Bakåtkompatibla ändringar i 2.2

### Databas backend API

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

- Tredjeparts databasbackends måste implementera stöd för tabellkontrollbegränsningar eller sätta `DatabaseFeatures.supports_table_check_constraints` till `False`.

- Tredjeparts databasbackends måste implementera stöd för att ignorera begränsningar eller unikhetsfel vid infogning eller ställa in `DatabaseFeatures.supports_ignore_conflicts` till `False`.

- Tredjeparts databasbackends måste implementera introspektion för `DurationField` eller sätta `DatabaseFeatures.can_introspect_duration_field` till `False`.

- `DatabaseFeatures.uses_savepoints` har nu standardvärdet `True`.

- Tredjeparts databasbackends måste implementera stöd för partiella index eller sätta `DatabaseFeatures.supports_partial_indexes` till `False`.

- `DatabaseIntrospection.table_name_converter()` och `column_name_converter()` tas bort. Tredjeparts databasbackends kan istället behöva implementera `DatabaseIntrospection.identifier_converter()`. I så fall måste de begränsningsnamn som `DatabaseIntrospection.get_constraints()` returnerar normaliseras med `identifier_converter()`.

- SQL-generering för index flyttas från `Index` till `SchemaEditor` och dessa `SchemaEditor`-metoder läggs till:

  - `_create_primary_key_sql()` och `_delete_primary_key_sql()`

  - `_delete_index_sql()` (att para ihop med `_create_index_sql()`)

  - `_delete_unique_sql` (att para ihop med `_create_unique_sql()`))

  - `_delete_fk_sql()` (att para ihop med `_create_fk_sql()`)

  - `_create_check_sql()` och `_delete_check_sql()`

- Det tredje argumentet i `DatabaseWrapper.__init__()`, `allow_thread_sharing`, har tagits bort.

### Admin-åtgärder samlas inte längre in från basklasserna `ModelAdmin`

Till exempel i äldre versioner av Django:

    from django.contrib import admin

    class BaseAdmin(admin.ModelAdmin):
        actions = ["a"]

    class SubAdmin(BaseAdmin):
        actions = ["b"]

`SubAdmin` skulle ha åtgärderna `'a` och `'b`.

Nu följer `actions` standard Python-arv. För att få samma resultat som tidigare:

    class SubAdmin(BaseAdmin):
        actions = BaseAdmin.actions + ["b"]

### `django.contrib.gis`

- Stöd för GDAL 1.9 och 1.10 har tagits bort.

### `TransactionTestCase` laddning av serialiserad data

Initiala datamigreringar laddas nu i `TransactionTestCase` i slutet av testet, efter databasspolningen. I äldre versioner laddades dessa data i början av testet, men detta förhindrar att alternativet `test --keepdb` fungerar korrekt (databasen var tom i slutet av hela testsviten). Denna ändring bör inte ha någon inverkan på dina tester om du inte har anpassat `TransactionTestCase`:s interna funktioner.

### `sqlparse` är ett nödvändigt beroende

För att förenkla några delar av Djangos databashantering är sqlparse 0.2.2+ nu ett obligatoriskt beroende. Det installeras automatiskt tillsammans med Django.

### alias för `cached_property`

I användning som:

    from django.utils.functional import cached_property

    class A:
        @cached_property
        def base(self):
            return ...

        alias = base

`alias` cachelagras inte. Där problemet kan upptäckas (Python 3.6 och senare), ger sådan användning nu upphov till ``TypeError: Det går inte att tilldela samma cached_property till två olika namn (’base’ och ’alias’)

Använd detta istället:

    import operator

    class A:
        ...

        alias = property(operator.attrgetter("base"))

### Behörigheter för proxymodeller

Rättigheter för proxymodeller skapas nu med hjälp av proxymodellens innehållstyp i stället för den konkreta modellens innehållstyp. En migrering kommer att uppdatera befintliga behörigheter när du kör `migrate`.

I admin är ändringen transparent för proxymodeller som har samma `app_label` som sin konkreta modell. I äldre versioner kunde dock användare med behörigheter för en proxymodell med en annan `app_label` än dess konkreta modell inte komma åt modellen i admin. Det är nu åtgärdat, men du kanske vill granska behörighetstilldelningarna för sådana proxymodeller (`[add|view|change|delete]_myproxy`) innan du uppgraderar för att säkerställa att den nya åtkomsten är lämplig.

Slutligen måste proxymodellens behörighetssträngar uppdateras så att de använder sin egen `app_label`. Till exempel, för `app.MyProxyModel` som ärver från `other_app.ConcreteModel`, uppdatera `user.has_perm('other_app.add_myproxymodel')` till `user.has_perm('app.add_myproxymodel')`.

### Sammanslagning av tillgångar i form av `Media`

Tillgångar i formuläret `Media` slås nu samman med hjälp av en topologisk sorteringsalgoritm, eftersom den gamla parvisa sammanslagningsalgoritmen är otillräcklig i vissa fall. CSS- och JavaScript-filer som inte inkluderar sina beroenden kan nu sorteras felaktigt (där den gamla algoritmen av en slump gav korrekta resultat).

Granska alla `Media`-klasser för eventuella saknade beroenden. Till exempel måste widgetar som är beroende av `django.jQuery` ange `js=['admin/js/jquery.init.js', ...]` när declaring form media assets.

### Diverse

- För att förbättra läsbarheten visar formfältet `UUIDField` nu värden med bindestreck, t.ex. `550e8400-e29b-41d4-a716-446655440000` istället för `550e8400e29b41d4a716446655440000`.

- I SQLite innehåller `PositiveIntegerField` och `PositiveSmallIntegerField` nu en check constraint för att förhindra negativa värden i databasen. Om du har befintliga ogiltiga data och kör en migrering som återskapar en tabell, kommer du att se `CHECK constraint failed`.

- För att vara konsekvent med WSGI-servrar sätter testklienten nu rubriken `Content-Length` till en sträng istället för ett heltal.

- Returvärdet för `django.utils.text.slugify()` är inte längre markerat som HTML-säkert.

- Det förvalda trunkeringstecknet som används av mallfiltren `urlizetrunc`, `truncatechars`, `truncatechars_html`, `truncatewords` och `truncatewords_html` är nu det riktiga ellipstecknet (`...`) istället för 3 punkter. Du kan behöva anpassa vissa jämförelser av testutdata.

- Stöd för bytestringssökvägar i mallfilsystemladdaren har tagits bort.

- `django.utils.http.urlsafe_base64_encode()` returnerar nu en sträng istället för en bytestring, och `django.utils.http.urlsafe_base64_decode()` kan inte längre skickas en bytestring.

- Stöd för `cx_Oracle` < 6.0 har tagits bort.

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

- Den lägsta versionen av SQLite som stöds har ökats från 3.7.15 till 3.8.3.

- I ett försök att tillhandahålla mer semantiska frågedata återger `NullBooleanSelect` nu `<option>` värdena `unknown`, `true` och `false` istället för `1`, `2` och `3`. För bakåtkompatibilitet accepteras fortfarande de gamla värdena som data.

- `Group.name <django.contrib.auth.models.Group.name>`` `max_length` ökas från 80 till 150 tecken.

- Tester som bryter mot deferrable databasbegränsningar misslyckas nu när de körs på SQLite 3.20+, precis som på andra backends som stöder sådana begränsningar.

- För att fånga upp användningsmisstag ger testet `Client` och `django.utils.http.urlencode()` nu upphov till `TypeError` om `None` skickas som ett värde att koda eftersom `None` inte kan kodas i GET- och POST-data. Antingen skicka en tom sträng eller utelämna värdet.

- Hanteringskommandot `ping_google` använder nu som standard `https` i stället för `http` för webbplatskartans URL. Om din webbplats använder http, använd det nya alternativet `ping_google --sitemap-uses-http`. Om du använder funktionen `django.contrib.sitemaps.ping_google`, sätt det nya argumentet `sitemap_uses_https` till `False`.

- `runserver` har inte längre stöd för `pyinotify` (ersatt av Watchman).

- Aggregatfunktionerna `Avg`, `StdDev` och `Variance` returnerar nu en `Decimal` istället för en `float` när indata är `Decimal`.

- Tester kommer att misslyckas på SQLite om appar utan migreringar har relationer till appar med migreringar. Detta har varit en dokumenterad begränsning sedan migreringar lades till i Django 1.7, men det misslyckas mer tillförlitligt nu. Du kommer att se tester som misslyckas med fel som `ingen sådan tabell: <app_label>_<model>`. Detta observerades med flera tredjepartsappar som hade modeller i tester utan migreringar. Du måste lägga till migreringar för sådana modeller.

- Om ett heltal anges i `key`-argumentet i `cache.delete()` eller `cache.get()` uppstår nu `ValueError`.

- Pluralekvationer för vissa språk har ändrats eftersom de senaste versionerna från Transifex har införts.

  Observera

  Möjligheten att hantera `.po`-filer som innehåller olika pluralekvationer för samma språk har lagts till i Django 2.2.12.

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

### Modellen `Meta.ordering` påverkar inte längre `GROUP BY`-frågor

En modells `Meta.ordering` som påverkar `GROUP BY`-frågor (t.ex. `.annotate().values()`) är en vanlig källa till förvirring. Sådana frågor ger nu en deprecation-varning med rådet att lägga till en `order_by()` för att behålla den aktuella frågan. `Meta.ordering` kommer att ignoreras i sådana frågor med start i Django 3.1.

### Diverse

- `django.utils.timezone.FixedOffset` är föråldrad till förmån för `datetime.timezone`.

- Det odokumenterade aliaset `QuerySetPaginator` för `django.core.paginator.Paginator` är föråldrat.

- Modell- och formulärfälten `FloatRangeField` i `django.contrib.postgres` är utdaterade till förmån för ett nytt namn, `DecimalRangeField`, för att matcha den underliggande datatypen `numrange` som används i databasen.

- Inställningen `FILE_CHARSET` är föråldrad. Från och med Django 3.1 måste filer som läses från disk vara UTF-8-kodade.

- `django.contrib.staticfiles.storage.CachedStaticFilesStorage` är föråldrad på grund av de olösliga problem som den har. Använd `ManifestStaticFilesStorage` eller en molnlagring från tredje part istället.

- `RemoteUserBackend.configure_user()` skickas nu `request` som det första positionella argumentet, om det accepterar det. Stöd för åsidosättningar som inte accepterar det kommer att tas bort i Django 3.1.

- Attributen `SimpleTestCase.allow_database_queries`, `TransactionTestCase.multi_db` och `TestCase.multi_db` är föråldrade till förmån för `SimpleTestCase.databases`, `TransactionTestCase.databases` och `TestCase.databases`. Dessa nya attribut gör det möjligt att deklarera databasberoenden för att förhindra att oväntade frågor mot databaser som inte är standarddatabaser läcker tillstånd mellan tester. Det tidigare beteendet med `allow_database_queries=True` och `multi_db=True` kan uppnås genom att ställa in `databases='__all__'`.