---
title: "Django 2.0 versionsinformation"
version: 6.0
locale: sv
source: https://docs.djangoproject.com/sv/6.0/releases/2.0/
canonical: https://djangodocs.dev/sv/6.0/releases/2.0/
---
# Django 2.0 versionsinformation

*2 december 2017*

Välkommen till Django 2.0!

Dessa versionsinformation täcker de [nya funktionerna](#whats-new-2-0), samt några [bakåtkompatibla ändringar](#backwards-incompatible-2-0) som du vill vara medveten om när du uppgraderar från Django 1.11 eller tidigare. Vi har [ta bort några funktioner](#removed-features-2-0) som har nått slutet av sin utfasningscykel, och vi har [startat utfasningsprocessen för några funktioner](#deprecated-features-2-0).

Denna utgåva börjar Djangos användning av en [lös form av semantisk versionshantering](/sv/6.0/internals/release-process/#internal-release-cadence), men det finns inga större bakåtkompatibla ändringar som kan förväntas av en 2.0-utgåva. Uppgradering bör vara en liknande mängd ansträngning som tidigare funktionsutgåvor.

Se guiden [Så här uppgraderar du Django till en nyare version](/sv/6.0/howto/upgrade-version/) om du ska uppdatera ett befintligt projekt.

## Kompatibilitet med Python

Django 2.0 stöder Python 3.4, 3.5, 3.6 och 3.7. Vi **rekommenderar** starkt och stöder endast officiellt den senaste versionen av varje serie.

Django 1.11.x-serien är den sista som stöder Python 2.7.

Django 2.0 kommer att vara den sista utgåveserien som stöder Python 3.4. Om du planerar en distribution av Python 3.4 bortom slutet av livscykeln för Django 2.0 (april 2019), håll dig till Django 1.11 LTS (stöds fram till april 2020) istället. Observera dock att slutdatumet för Python 3.4 är mars 2019.

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

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

## Vad är nytt i Django 2.0

### Förenklad syntax för URL-routning

The new [`django.urls.path()`](/sv/6.0/ref/urls/#django.urls.path) function allows a simpler, more readable URL
routing syntax. For example, this example from previous Django releases:

```
url(r"^articles/(?P<year>[0-9]{4})/$", views.year_archive),
```

skulle kunna skrivas som:

```
path("articles/<int:year>/", views.year_archive),
```

Den nya syntaxen stöder typkoercition av URL-parametrar. I exemplet kommer vyn att ta emot nyckelordsargumentet `year` som ett heltal snarare än som en sträng. Dessutom är de webbadresser som kommer att matcha något mindre begränsade i det omskrivna exemplet. Till exempel kommer år 10000 nu att matcha eftersom årtalen inte är begränsade till att vara exakt fyra siffror långa som de är i det reguljära uttrycket.

Funktionen `django.conf.urls.url()` från tidigare versioner är nu tillgänglig som [`django.urls.re_path()`](/sv/6.0/ref/urls/#django.urls.re_path). Den gamla platsen finns kvar för bakåtkompatibilitet, utan en överhängande föråldring. Den gamla funktionen `django.conf.urls.include()` är nu importerbar från `django.urls` så att du kan använda `from django.urls import include, path, re_path` i dina URLconfs.

Dokumentet [URL-distributör](/sv/6.0/topics/http/urls/) är omskrivet för att innehålla den nya syntaxen och ge mer information.

### Mobilvänlig `contrib.admin`

Administrationen är nu responsiv och stöder alla större mobila enheter. Äldre webbläsare kan uppleva varierande nivåer av graceful degradation.

### Uttryck i fönster

Det nya [`Window`](/sv/6.0/ref/models/expressions/#django.db.models.expressions.Window)-uttrycket gör det möjligt att lägga till en `OVER`-klausul till querysets. Du kan använda [window functions](/sv/6.0/ref/models/database-functions/#window-functions) och [aggregate functions](/sv/6.0/ref/models/querysets/#aggregation-functions) i uttrycket.

### Mindre funktioner

#### [`django.contrib.admin`](/sv/6.0/ref/contrib/admin/#module-django.contrib.admin)

- Det nya attributet [`ModelAdmin.autocomplete_fields`](/sv/6.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.autocomplete_fields) och metoden [`ModelAdmin.get_autocomplete_fields()`](/sv/6.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_autocomplete_fields) gör det möjligt att använda en sökwidget [Select2](https://select2.org/) för `ForeignKey` och `ManyToManyField`.

#### [`django.contrib.auth`](/sv/6.0/topics/auth/#module-django.contrib.auth)

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

#### [`django.contrib.gis`](/sv/6.0/ref/contrib/gis/#module-django.contrib.gis)

- Lagt till MySQL-stöd för funktionen [`AsGeoJSON`](/sv/6.0/ref/contrib/gis/functions/#django.contrib.gis.db.models.functions.AsGeoJSON), [`GeoHash`](/sv/6.0/ref/contrib/gis/functions/#django.contrib.gis.db.models.functions.GeoHash), [`IsValid`](/sv/6.0/ref/contrib/gis/functions/#django.contrib.gis.db.models.functions.IsValid), [`isvalid`](/sv/6.0/ref/contrib/gis/geoquerysets/#std-fieldlookup-isvalid) lookup, och [distance lookups](/sv/6.0/ref/contrib/gis/geoquerysets/#distance-lookups).
- Lade till funktionerna [`Azimuth`](/sv/6.0/ref/contrib/gis/functions/#django.contrib.gis.db.models.functions.Azimuth) och [`LineLocatePoint`](/sv/6.0/ref/contrib/gis/functions/#django.contrib.gis.db.models.functions.LineLocatePoint), som stöds av PostGIS och SpatiaLite.
- Alla [`GEOSGeometry`](/sv/6.0/ref/contrib/gis/geos/#django.contrib.gis.geos.GEOSGeometry) som importeras från GeoJSON har nu sin SRID inställd.
- Lagt till attributet [`OSMWidget.default_zoom`](/sv/6.0/ref/contrib/gis/forms-api/#django.contrib.gis.forms.widgets.OSMWidget.default_zoom) för att anpassa kartans standardzoomnivå.
- Gjorde metadata läsbara och redigerbara på raster genom attributen [`metadata`](/sv/6.0/ref/contrib/gis/gdal/#django.contrib.gis.gdal.GDALRaster.metadata), [`info`](/sv/6.0/ref/contrib/gis/gdal/#django.contrib.gis.gdal.GDALRaster.info) och [`metadata`](/sv/6.0/ref/contrib/gis/gdal/#django.contrib.gis.gdal.GDALBand.metadata).
- Tillåtet att skicka drivrutinsspecifika skapelsealternativ till [`GDALRaster`](/sv/6.0/ref/contrib/gis/gdal/#django.contrib.gis.gdal.GDALRaster)-objekt med hjälp av `papsz_options`.
- Tillåtet att skapa [`GDALRaster`](/sv/6.0/ref/contrib/gis/gdal/#django.contrib.gis.gdal.GDALRaster)-objekt i GDAL:s interna virtuella filsystem. Raster kan nu [skapas från och konverteras till binärdata](/sv/6.0/ref/contrib/gis/gdal/#gdal-raster-vsimem) i minnet.
- Den nya metoden [`GDALBand.color_interp()`](/sv/6.0/ref/contrib/gis/gdal/#django.contrib.gis.gdal.GDALBand.color_interp) returnerar färgtolkningen för bandet.

#### [`django.contrib.postgres`](/sv/6.0/ref/contrib/postgres/#module-django.contrib.postgres)

- Det nya argumentet `distinct` för [`ArrayAgg`](/sv/6.0/ref/contrib/postgres/aggregates/#django.contrib.postgres.aggregates.ArrayAgg) avgör om sammanlänkade värden ska vara distinkta.
- Den nya [`RandomUUID`](/sv/6.0/ref/contrib/postgres/functions/#django.contrib.postgres.functions.RandomUUID) databasfunktionen returnerar en version 4 UUID. Det kräver användning av PostgreSQL: s pgcrypto \`\` förlängning som kan aktiveras med den nya [`CryptoExtension`](/sv/6.0/ref/contrib/postgres/operations/#django.contrib.postgres.operations.CryptoExtension) migreringsoperationen.
- [`django.contrib.postgres.indexes.GinIndex`](/sv/6.0/ref/contrib/postgres/indexes/#django.contrib.postgres.indexes.GinIndex) stöder nu parametrarna `fastupdate` och `gin_pending_list_limit`.
- Den nya [`GistIndex`](/sv/6.0/ref/contrib/postgres/indexes/#django.contrib.postgres.indexes.GistIndex)-klassen gör det möjligt att skapa `GiST`-index i databasen. Den nya [`BtreeGistExtension`](/sv/6.0/ref/contrib/postgres/operations/#django.contrib.postgres.operations.BtreeGistExtension)-migreringsoperationen installerar `btree_gist`-tillägget för att lägga till stöd för operatörsklasser som inte är inbyggda.
- [`inspectdb`](/sv/6.0/ref/django-admin/#django-admin-inspectdb) kan nu introspektera `JSONField` och olika `RangeField` (`django.contrib.postgres` måste finnas i `INSTALLED_APPS`).

#### [`django.contrib.sitemaps`](/sv/6.0/ref/contrib/sitemaps/#module-django.contrib.sitemaps)

- Lade till nyckelordsargumentet `protocol` till [`GenericSitemap`](/sv/6.0/ref/contrib/sitemaps/#django.contrib.sitemaps.GenericSitemap)-konstruktören.

#### Cache

- `cache.set_many()` returnerar nu en lista över nycklar som inte kunde infogas. För de inbyggda backends kan misslyckade inmatningar endast ske på memcached.

#### Fil delning

- [`File.open()`](/sv/6.0/ref/files/file/#django.core.files.File.open) kan användas som en kontexthanterare, t.ex. `med file.open() som f:`.

#### Formulär

- De nya argumenten `date_attrs` och `time_attrs` för [`SplitDateTimeWidget`](/sv/6.0/ref/forms/widgets/#django.forms.SplitDateTimeWidget) och [`SplitHiddenDateTimeWidget`](/sv/6.0/ref/forms/widgets/#django.forms.SplitHiddenDateTimeWidget) gör det möjligt att ange olika HTML-attribut för underwidgetarna `DateInput` och `TimeInput` (eller dolda).
- Den nya [`Form.errors.get_json_data()`](/sv/6.0/ref/forms/api/#django.forms.Form.errors.get_json_data)-metoden returnerar formulärfel som en ordbok som är lämplig att inkludera i ett JSON-svar.

#### Generiska åsikter

- Det nya attributet [`ContextMixin.extra_context`](/sv/6.0/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin.extra_context) gör det möjligt att lägga till kontext i `View.as_view()`.

#### Kommandon för hantering

- [`inspectdb`](/sv/6.0/ref/django-admin/#django-admin-inspectdb) översätter nu MySQL:s osignerade heltalskolumner till `PositiveIntegerField` eller `PositiveSmallIntegerField`.
- Det nya alternativet [`makemessages --add-location`](/sv/6.0/ref/django-admin/#cmdoption-makemessages-add-location) styr kommentarsformatet i `.po`-filer.
- [`loaddata`](/sv/6.0/ref/django-admin/#django-admin-loaddata) kan nu [läsa från stdin](/sv/6.0/ref/django-admin/#loading-fixtures-stdin).
- Det nya alternativet [`diffsettings --output`](/sv/6.0/ref/django-admin/#cmdoption-diffsettings-output) gör det möjligt att formatera utdata i ett enhetligt diff-format.
- På Oracle kan [`inspectdb`](/sv/6.0/ref/django-admin/#django-admin-inspectdb) nu introspektera `AutoField` om kolumnen är skapad som en identitetskolumn.
- I MySQL har [`dbshell`](/sv/6.0/ref/django-admin/#django-admin-dbshell) nu stöd för TLS-certifikat på klientsidan.

#### Migreringar

- Det nya alternativet [`squashmigrations --squashed-name`](/sv/6.0/ref/django-admin/#cmdoption-squashmigrations-squashed-name) gör det möjligt att namnge den krossade migreringen.

#### Modeller

- Den nya [`StrIndex`](/sv/6.0/ref/models/database-functions/#django.db.models.functions.StrIndex) databasfunktionen hittar startindexet för en sträng inuti en annan sträng.
- I Oracle skapas nu `AutoField` och `BigAutoField` som [identitetskolumner](https://docs.oracle.com/en/database/oracle/oracle-database/21/drdaa/intro-to-tools-and-products-supporting-migraiton.html#GUID-14E4817B-F3BC-4D99-B471-A0ACDC303CC9).
- Den nya parametern `chunk_size` i [`QuerySet.iterator()`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.iterator) styr antalet rader som hämtas av Python-databasklienten när resultat strömmas från databasen. För databaser som inte stöder markörer på serversidan kontrollerar den antalet resultat som Django hämtar från databasadaptern.
- [`QuerySet.earliest()`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.earliest), [`QuerySet.latest()`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.latest), och [`Meta.get_latest_by`](/sv/6.0/ref/models/options/#django.db.models.Options.get_latest_by) tillåter nu beställning av flera fält.
- Lade till funktionen [`ExtractQuarter`](/sv/6.0/ref/models/database-functions/#django.db.models.functions.ExtractQuarter) för att extrahera kvartalet från [`DateField`](/sv/6.0/ref/models/fields/#django.db.models.DateField) och [`DateTimeField`](/sv/6.0/ref/models/fields/#django.db.models.DateTimeField), och exponerade den genom [`quarter`](/sv/6.0/ref/models/querysets/#std-fieldlookup-quarter) lookup.
- Lagt till funktionen [`TruncQuarter`](/sv/6.0/ref/models/database-functions/#django.db.models.functions.TruncQuarter) för att trunkera [`DateField`](/sv/6.0/ref/models/fields/#django.db.models.DateField) och [`DateTimeField`](/sv/6.0/ref/models/fields/#django.db.models.DateTimeField) till den första dagen i ett kvartal.
- Lagt till parametern [`db_tablespace`](/sv/6.0/ref/models/indexes/#django.db.models.Index.db_tablespace) för klassbaserade index.
- Om databasen stöder ett inbyggt varaktighetsfält (Oracle och PostgreSQL), fungerar [`Extract`](/sv/6.0/ref/models/database-functions/#django.db.models.functions.Extract) nu med [`DurationField`](/sv/6.0/ref/models/fields/#django.db.models.DurationField).
- Added the `of` argument to [`QuerySet.select_for_update()`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.select_for_update), supported
  on PostgreSQL and Oracle, to lock only rows from specific tables rather than
  all selected tables. It may be helpful particularly when
  [`select_for_update()`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.select_for_update) is used in conjunction with
  [`select_related()`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.select_related).
- Den nya parametern `field_name` i [`QuerySet.in_bulk()`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.in_bulk) gör det möjligt att hämta resultat baserat på alla unika modellfält.
- [`CursorWrapper.callproc()`](/sv/6.0/topics/db/sql/#django.db.models.CursorWrapper.callproc) now takes an optional dictionary of keyword
  parameters, if the backend supports this feature. Of Django’s built-in
  backends, only Oracle supports it.
- Den nya metoden [`connection.execute_wrapper()`](/sv/6.0/topics/db/instrumentation/#django.db.backends.base.DatabaseWrapper.execute_wrapper) gör det möjligt att [installera omslag runt exekvering av databasfrågor](/sv/6.0/topics/db/instrumentation/).
- Det nya `filter`-argumentet för inbyggda aggregat gör det möjligt att [lägga till olika villkor](/sv/6.0/ref/models/conditional-expressions/#conditional-aggregation) till flera aggregat över samma fält eller relationer.
- Lagt till stöd för uttryck i [`Meta.ordering`](/sv/6.0/ref/models/options/#django.db.models.Options.ordering).
- Den nya parametern `named` i [`QuerySet.values_list()`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.values_list) gör det möjligt att hämta resultat som namngivna tuples.
- Den nya klassen [`FilteredRelation`](/sv/6.0/ref/models/querysets/#django.db.models.FilteredRelation) gör det möjligt att lägga till en `ON`-klausul i frågeuppsättningar.

#### Sidindelning

- Lagt till [`Paginator.get_page()`](/sv/6.0/ref/paginator/#django.core.paginator.Paginator.get_page) för att tillhandahålla det dokumenterade mönstret för hantering av ogiltiga sidnummer.

#### Förfrågningar och svar

- Webbservern [`runserver`](/sv/6.0/ref/django-admin/#django-admin-runserver) har stöd för HTTP 1.1.

#### Mallar

- För att öka användbarheten av [`Engine.get_default()`](/sv/6.0/ref/templates/api/#django.template.Engine.get_default) i tredjepartsappar returnerar den nu den första motorn om flera `DjangoTemplates`-motorer är konfigurerade i `TEMPLATES` istället för att höja `ImproperlyConfigured`.
- Anpassade malltaggar kan nu acceptera argument som endast innehåller nyckelord.

#### Tester

- Lagt till stöd för trådning i [`LiveServerTestCase`](/sv/6.0/topics/testing/tools/#django.test.LiveServerTestCase).
- Lagt till inställningar som gör det möjligt att anpassa parametrarna för testtabellutrymmen för Oracle: [`DATAFILE_SIZE`](/sv/6.0/ref/settings/#std-setting-DATAFILE_SIZE), [`DATAFILE_TMP_SIZE`](/sv/6.0/ref/settings/#std-setting-DATAFILE_TMP_SIZE), [`DATAFILE_EXTSIZE`](/sv/6.0/ref/settings/#std-setting-DATAFILE_EXTSIZE) och [`DATAFILE_TMP_EXTSIZE`](/sv/6.0/ref/settings/#std-setting-DATAFILE_TMP_EXTSIZE).

#### Validerare

- Den nya [`ProhibitNullCharactersValidator`](/sv/6.0/ref/validators/#django.core.validators.ProhibitNullCharactersValidator) tillåter inte nolltecken i inmatningen i formulärfältet [`CharField`](/sv/6.0/ref/forms/fields/#django.forms.CharField) och dess underklasser. Inmatning av nolltecken observerades från verktyg för sårbarhetsskanning. De flesta databaser kasserar tyst nolltecken, men psycopg2 2.7+ ger upphov till ett undantag när man försöker spara ett nolltecken i ett char/text-fält med PostgreSQL.

## Bakåtkompatibla ändringar i 2.0

### Borttaget stöd för bytestrings på vissa ställen

För att stödja inbyggda Python 2-strängar var äldre Django-versioner tvungna att acceptera både bytestrings och Unicode-strängar. Nu när Python 2-stödet är borttaget bör bytestrings endast påträffas runt inmatnings-/utmatningsgränser (hantering av binära fält eller HTTP-strömmar, till exempel). Du kan behöva uppdatera din kod för att begränsa användningen av bytestringar till ett minimum, eftersom Django inte längre accepterar bytestringar i vissa kodvägar. Pythons [`-b`](https://docs.python.org/3/using/cmdline.html#cmdoption-b)-alternativ kan hjälpa till att upptäcka detta misstag i din kod.

Till exempel använder `reverse()` nu `str()` i stället för `force_text()` för att tvinga fram de `args` och `kwargs` som tas emot innan de placeras i URL:en. För bytestrings skapar detta en sträng med ett oönskat `b`-prefix samt ytterligare citattecken (`str(b'foo')` är `"b'foo'"`). För att anpassa dig, anropa `decode()` på bytestringen innan du skickar den till `reverse()`.

### Databas backend API

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

- Metoderna `DatabaseOperations.datetime_cast_date_sql()`, `datetime_cast_time_sql()`, `datetime_trunc_sql()`, `datetime_extract_sql()` och `date_interval_sql()` returnerar nu endast SQL för att utföra åtgärden istället för SQL och en lista med parametrar.
- Tredjeparts databasbackends bör lägga till ett `DatabaseWrapper.display_name`-attribut med namnet på databasen som din backend arbetar med. Django kan använda det i olika meddelanden, till exempel i systemkontroller.
- Det första argumentet i `SchemaEditor._alter_column_type_sql()` är nu `model` istället för `table`.
- Det första argumentet i `SchemaEditor._create_index_name()` är nu `table_name` istället för `model`.
- För att aktivera stöd för `FOR UPDATE OF` anges `DatabaseFeatures.has_select_for_update_of = True`. Om databasen kräver att argumenten till `OF` ska vara kolumner i stället för tabeller, anger du `DatabaseFeatures.select_for_update_of_column = True`.
- För att aktivera stöd för [`Window`](/sv/6.0/ref/models/expressions/#django.db.models.expressions.Window) uttryck, ställ in `DatabaseFeatures.supports_over_clause` till `True`. Du kan behöva anpassa metoderna `DatabaseOperations.window_start_rows_start_end()` och/eller `window_start_range_start_end()`.
- Tredjeparts databasbackends bör lägga till ett `DatabaseOperations.cast_char_field_without_max_length`-attribut med databasdatatypen som kommer att användas i [`Cast`](/sv/6.0/ref/models/database-functions/#django.db.models.functions.Cast)-funktionen för en `CharField` om argumentet `max_length` inte tillhandahålls.
- Det första argumentet i `DatabaseCreation._clone_test_db()` och `get_test_db_clone_settings()` är nu `uffix` snarare än `nummer` (om du vill byta namn på signaturerna i din backend för konsekvens). `django.test` skickar nu också dessa värden som strängar snarare än som heltal.
- Tredjeparts databas backends bör lägga till en `DatabaseIntrospection.get_sequences()` metod baserad på stubben i `BaseDatabaseIntrospection`.

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

Slutet på uppströmsstöd för Oracle 11.2 är december 2020. Django 1.11 kommer att stödjas fram till april 2020 vilket nästan når detta datum. Django 2.0 stöder officiellt Oracle 12.1+.

### MySQL:s standardisoleringsnivå är read committed

MySQL:s standardisoleringsnivå, repeatable read, kan orsaka dataförlust vid typisk Django-användning. För att förhindra detta och för att vara konsekvent med andra databaser är standardisoleringsnivån nu read committed. Du kan använda inställningen `DATABASER` för att [använda en annan isoleringsnivå](/sv/6.0/ref/databases/#mysql-isolation-level), om det behövs.

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

En migrering för [`django.contrib.auth.models.User.last_name`](/sv/6.0/ref/contrib/auth/#django.contrib.auth.models.User.last_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 efternamn kan du använda ett anpassat formulär:

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

class MyUserChangeForm(UserChangeForm):
    last_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)
```

### `QuerySet.reverse()` och `last()` är förbjudna efter skärning

Att anropa `QuerySet.reverse()` eller `last()` på en skivad frågeuppsättning leder till oväntade resultat på grund av att skivningen tillämpas efter omordning. Detta är nu förbjudet, t.ex:

```pycon
>>> Model.objects.all()[:2].reverse()
Traceback (most recent call last):
...
TypeError: Cannot reverse a query once a slice has been taken.
```

### Formulärfält accepterar inte längre valfria argument som positionella argument

För att förhindra körtidsfel på grund av felaktig ordning på formulärfältsargument accepteras inte längre valfria argument i inbyggda formulärfält som positionsargument. Till exempel:

```
forms.IntegerField(25, 10)
```

ger upphov till ett undantag och bör ersättas med:

```
forms.IntegerField(max_value=25, min_value=10)
```

### `call_command()` validerar de alternativ den tar emot

`call_command()` validerar nu att argumentparsern för kommandot som anropas definierar alla alternativ som skickas till `call_command()`.

För anpassade hanteringskommandon som använder alternativ som inte skapats med `parser.add_argument()`, lägg till ett `stealth_options`-attribut på kommandot:

```
class MyCommand(BaseCommand):
    stealth_options = ("option_name", ...)
```

### Index accepterar inte längre positionella argument

Till exempel:

```
models.Index(["headline", "-pub_date"], "index_name")
```

ger upphov till ett undantag och bör ersättas med:

```
models.Index(fields=["headline", "-pub_date"], name="index_name")
```

### Foreign key constraints är nu aktiverade i SQLite

Detta kommer att visas som en bakåtkompatibel ändring (`IntegrityError: FOREIGN KEY constraint failed`) om du försöker spara en befintlig modellinstans som bryter mot en främmande nyckelbegränsning.

Utländska nycklar skapas nu med `DEFERRABLE INITIALLY DEFERRED` istället för `DEFERRABLE IMMEDIATE`. Därför kan tabeller behöva byggas om för att återskapa främmande nycklar med den nya definitionen, särskilt om du använder ett mönster som detta:

```
from django.db import transaction

with transaction.atomic():
    Book.objects.create(author_id=1)
    Author.objects.create(id=1)
```

Om du inte återskapar den främmande nyckeln som `DEFERRED` kommer den första `create()` att misslyckas nu när begränsningar för främmande nycklar tillämpas.

Säkerhetskopiera din databas först! När du har uppgraderat till Django 2.0 kan du sedan bygga om tabeller med hjälp av ett skript som liknar detta:

```
from django.apps import apps
from django.db import connection

for app in apps.get_app_configs():
    for model in app.get_models(include_auto_created=True):
        if model._meta.managed and not (model._meta.proxy or model._meta.swapped):
            for base in model.__bases__:
                if hasattr(base, "_meta"):
                    base._meta.local_many_to_many = []
            model._meta.local_many_to_many = []
            with connection.schema_editor() as editor:
                editor._remake_table(model)
```

Detta skript har inte genomgått omfattande tester och behöver anpassas för olika fall, t.ex. flera databaser. Du är välkommen att bidra med förbättringar.

På grund av en tabelländringsbegränsning i SQLite är det dessutom förbjudet att utföra [`RenameModel`](/sv/6.0/ref/migration-operations/#django.db.migrations.operations.RenameModel) och [`RenameField`](/sv/6.0/ref/migration-operations/#django.db.migrations.operations.RenameField) på modeller eller fält som refereras av andra modeller i en transaktion. För att tillåta att migreringar som innehåller dessa operationer tillämpas måste du ställa in attributet `Migration.atomic` till `False`.

### Diverse

- Klassen `SessionAuthenticationMiddleware` tas bort. Den gav ingen funktionalitet eftersom sessionsautentisering är ovillkorligt aktiverad i Django 1.10.
- Standard HTTP-felhanterare (`handler404`, etc.) är nu callables istället för prickade Python-sökvägssträngar. Django föredrar anropsbara referenser eftersom de ger bättre prestanda och felsökningsupplevelse.
- [`RedirectView`](/sv/6.0/ref/class-based-views/base/#django.views.generic.base.RedirectView) tystnar inte längre `NoReverseMatch` om `pattern_name` inte existerar.
- När `USE_L10N` är av respekterar nu [`FloatField`](/sv/6.0/ref/forms/fields/#django.forms.FloatField) och [`DecimalField`](/sv/6.0/ref/forms/fields/#django.forms.DecimalField) [`DECIMAL_SEPARATOR`](/sv/6.0/ref/settings/#std-setting-DECIMAL_SEPARATOR) och [`THOUSAND_SEPARATOR`](/sv/6.0/ref/settings/#std-setting-THOUSAND_SEPARATOR) under validering. Till exempel, med inställningarna:

  ```
  USE_L10N = False
  USE_THOUSAND_SEPARATOR = True
  DECIMAL_SEPARATOR = ","
  THOUSAND_SEPARATOR = "."
  ```

  en inmatning av `"1,345"` konverteras nu till `1345` istället för `1,345`.
- Underklasser av [`AbstractBaseUser`](/sv/6.0/topics/auth/customizing/#django.contrib.auth.models.AbstractBaseUser) behöver inte längre implementera `get_short_name()` och `get_full_name()`. (Basimplementeringarna som ger upphov till `NotImplementedError` tas bort.) `django.contrib.admin` använder dessa metoder om de är implementerade men kräver dem inte. Tredjepartsappar som använder dessa metoder kanske vill anta ett liknande tillvägagångssätt.
- Formatinställningarna `FIRST_DAY_OF_WEEK` och `NUMBER_GROUPING` sparas nu som heltal i JavaScript- och JSON i18n-vyutdata.
- [`assertNumQueries()`](/sv/6.0/topics/testing/tools/#django.test.TransactionTestCase.assertNumQueries) ignorerar nu frågor om anslutningskonfiguration. Tidigare, om ett test öppnade en ny databasanslutning, kunde dessa frågor inkluderas som en del av `assertNumQueries()`-räkningen.
- Standardstorleken för Oracle test tablespace ökas från 20M till 50M och standardstorleken för autoextend ökas från 10M till 25M.
- För att förbättra prestandan vid streaming av stora resultatuppsättningar från databasen hämtar [`QuerySet.iterator()`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.iterator) nu 2000 rader åt gången istället för 100. Det gamla beteendet kan återställas med hjälp av parametern `chunk_size`. Till exempel:

  ```
  Book.objects.iterator(chunk_size=100)
  ```
- Om okända paketnamn anges i argumentet `packages` i vyn [`JavaScriptCatalog`](/sv/6.0/topics/i18n/translation/#django.views.i18n.JavaScriptCatalog) utlöses nu `ValueError` istället för att passera tyst.
- En modellinstans primärnyckel visas nu i standardmetoden `Model.__str__()`, t.ex. `Frågeobjekt (1)`.
- `makemigrations` upptäcker nu ändringar i modellfältets `limit_choices_to`-alternativ. Lägg till detta i dina befintliga migreringar eller acceptera en automatiskt genererad migrering för fält som använder det.
- Utförande av frågor som kräver [automatiska rumsliga transformationer](/sv/6.0/ref/contrib/gis/tutorial/#automatic-spatial-transformations) ger nu upphov till `NotImplementedError` på MySQL istället för att tyst använda icke-transformerade geometrier.
- `django.core.exceptions.DjangoRuntimeWarning` är borttagen. Den användes endast i cache-backend som en mellanliggande klass i `CacheKeyWarning` arv av `RuntimeWarning`.
- Bytte namn på `BaseExpression._output_field` till `output_field`. Du kan behöva uppdatera anpassade uttryck.
- I äldre versioner kombinerar formulär och formuläruppsättningar sin `Media` med widgetens `Media` genom att konkatenera de två. Kombinationen försöker nu [bevara den relativa ordningen på elementen i varje lista](/sv/6.0/topics/forms/media/#form-media-asset-order). `MediaOrderConflictWarning` utfärdas om ordningen inte kan bevaras.
- `django.contrib.gis.gdal.OGRException` är borttagen. Det har varit ett alias för `GDALException` sedan Django 1.8.
- Stöd för GEOS 3.3.x har tagits bort.
- Sättet på vilket data väljs för `GeometryField` har ändrats för att förbättra prestanda, och i råa SQL-frågor måste dessa fält nu omslutas av `connection.ops.select`. Se [Raw queries note](/sv/6.0/ref/contrib/gis/tutorial/#gis-raw-sql) i GIS-handledningen för ett exempel.

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

### `context` argument för `Field.from_db_value()` och `Expression.convert_value()`

Argumentet `context` i `Field.from_db_value()` och `Expression.convert_value()` är oanvänt eftersom det alltid är en tom ordbok. Signaturen för båda metoderna är nu:

```
(self, value, expression, connection)
```

istället för:

```
(self, value, expression, connection, context)
```

Stöd för den gamla signaturen i anpassade fält och uttryck finns kvar till Django 3.0.

### Diverse

- Modulen `django.db.backends.postgresql_psycopg2` är utfasad till förmån för `django.db.backends.postgresql`. Det har varit ett alias sedan Django 1.9. Detta påverkar endast kod som importerar från modulen direkt. Inställningen `DATABASER` kan fortfarande använda `'django.db.backends.postgresql_psycopg2'`, men du kan förenkla det genom att använda namnet `'django.db.backends.postgresql'` som lades till i Django 1.9.
- `django.shortcuts.render_to_response()` är föråldrad till förmån för [`django.shortcuts.render()`](/sv/6.0/topics/http/shortcuts/#django.shortcuts.render). `render()` tar samma argument förutom att det också kräver en `request`.
- Inställningen `DEFAULT_CONTENT_TYPE` är föråldrad. Den fungerar inte bra med tredjepartsappar och är föråldrad eftersom HTML5 till stor del har ersatt XHTML.
- `HttpRequest.xreadlines()` är föråldrad till förmån för att iterera över begäran.
- Nyckelordsargumentet `field_name` till [`QuerySet.earliest()`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.earliest) och [`QuerySet.latest()`](/sv/6.0/ref/models/querysets/#django.db.models.query.QuerySet.latest) är föråldrat till förmån för att skicka fältnamnen som argument. Skriv `.earliest('pub_date')` i stället för `.earliest(field_name='pub_date')`.

## Funktioner borttagna i 2.0

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

Se [Funktioner som inte längre är aktuella i 1.9](/sv/6.0/releases/1.9/#deprecated-features-1-9) för detaljer om dessa ändringar, inklusive hur man tar bort användningen av dessa funktioner.

- Argumentet `weak` till `django.dispatch.signals.Signal.disconnect()` har tagits bort.
- `django.db.backends.base.BaseDatabaseOperations.check_aggregate_support()` har tagits bort.
- Paketet `django.forms.extras` har tagits bort.
- Hjälpverktyget `assignment_tag` tas bort.
- Argumentet `host` till `SimpleTestCase.assertsRedirects()` har tagits bort. Kompatibilitetslagret som gör att absoluta URL:er kan betraktas som likvärdiga med relativa när sökvägen är identisk har också tagits bort.
- `Field.rel` och `Field.remote_field.to` har tagits bort.
- Argumentet `on_delete` för `ForeignKey` och `OneToOneField` krävs nu i modeller och migreringar. Överväg att komprimera migreringar så att du har färre av dem att uppdatera.
- `django.db.models.fields.add_lazy_relation()` har tagits bort.
- När stöd för tidszoner är aktiverat konverterar databasbackends som inte stöder tidszoner inte längre medvetna datatider till naiva värden i UTC när sådana värden skickas som parametrar till SQL-frågor som körs utanför ORM, t.ex. med `cursor.execute()`.
- `django.contrib.auth.tests.utils.skipIfCustomUser()` har tagits bort.
- Klasserna `GeoManager` och `GeoQuerySet` tas bort.
- Modulen `django.contrib.gis.geoip` har tagits bort.
- `supports_recursion` kontrollen för mallladdare är borttagen från:

  - `django.template.engine.Engine.find_template()`
  - `django.template.loader_tags.ExtendsNode.find_template()`
  - `django.template.loaders.base.Loader.supports_recursion()`
  - `django.template.loaders.cached.Loader.supports_recursion()`
- Mallinläsningsmetoderna `load_template` och `load_template_sources` har tagits bort.
- Argumentet `template_dirs` för mallladdare har tagits bort:

  - `django.template.loaders.base.Loader.get_template()`
  - `django.template.loaders.cached.Loader.cache_key()`
  - `django.template.loaders.cached.Loader.get_template()`
  - `django.template.loaders.cached.Loader.get_template_sources()`
  - `django.template.loaders.filesystem.Loader.get_template_sources()`
- `django.template.loaders.base.Loader.__call__()` tas bort.
- Stöd för anpassade felvyer som inte accepterar en `exception`-parameter har tagits bort.
- Attributet `mime_type` för `django.utils.feedgenerator.Atom1Feed` och `django.utils.feedgenerator.RssFeed` har tagits bort.
- Argumentet `app_name` till `include()` tas bort.
- Stöd för att skicka en 3-tupel (inklusive `admin.site.urls`) som det första argumentet till `include()` har tagits bort.
- Stöd för att ange en URL-instansnamnrymd utan en applikationsnamnrymd har tagits bort.
- `Field._get_val_from_obj()` har tagits bort.
- `django.template.loaders.eggs.Loader` tas bort.
- Parametern `current_app` för de funktionsbaserade vyerna `contrib.auth` har tagits bort.
- Nyckelordsargumentet `callable_obj` till `SimpleTestCase.assertRaisesMessage()` har tagits bort.
- Stöd för attributet `allow_tags` på `ModelAdmin`-metoder har tagits bort.
- Nyckelordsargumentet `enclosure` till `SyndicationFeed.add_item()` har tagits bort.
- Aliasen `django.template.loader.LoaderOrigin` och `django.template.base.StringOrigin` för `django.template.base.Origin` har tagits bort.

Se [Funktioner som inte längre är aktuella i 1.10](/sv/6.0/releases/1.10/#deprecated-features-1-10) för detaljer om dessa ändringar.

- Alternativet `makemigrations --exit` har tagits bort.
- Stöd för direkt tilldelning till en omvänd främmande nyckel eller en relation mellan många och många har tagits bort.
- Metoderna `get_srid()` och `set_srid()` i `django.contrib.gis.geos.GEOSGeometry` tas bort.
- Metoderna `get_x()`, `set_x()`, `get_y()`, `set_y()`, `get_z()` och `set_z()` i `django.contrib.gis.geos.Point` tas bort.
- Metoderna `get_coords()` och `set_coords()` i `django.contrib.gis.geos.Point` tas bort.
- Egenskapen `cascaded_union` för `django.contrib.gis.geos.MultiPolygon` har tagits bort.
- `django.utils.functional.allow_lazy()` har tagits bort.
- Alternativet `shell --plain` har tagits bort.
- Modulen `django.core.urlresolvers` tas bort till förmån för dess nya plats, `django.urls`.
- `CommaSeparatedIntegerField` tas bort, med undantag för stöd i historiska migreringar.
- Metoden `Context.has_key()` i mallen har tagits bort.
- Stöd för metoderna `django.core.files.storage.Storage.accessed_time()`, `created_time()` och `modified_time()` har tagits bort.
- Stöd för frågeuppslagningar som använder modellnamnet när `Meta.default_related_name` är inställt har tagits bort.
- MySQL-uppslagsordet `__search` har tagits bort.
- Shim för att stödja anpassade relaterade manager-klasser utan en `_apply_rel_filters()`-metod har tagits bort.
- Att använda `User.is_authenticated()` och `User.is_anonymous()` som metoder istället för egenskaper stöds inte längre.
- Attributet `Model._meta.virtual_fields` har tagits bort.
- Nyckelordsargumenten `virtual_only` i `Field.contribute_to_class()` och `virtual` i `Model._meta.add_field()` tas bort.
- Vyerna `javascript_catalog()` och `json_catalog()` är borttagna.
- `django.contrib.gis.utils.precision_wkt()` har tagits bort.
- I multi-table inheritance tas implicit promotion av en `OneToOneField` till en `parent_link` bort.
- Stöd för `Widget._format_value()` har tagits bort.
- metoderna `FileField` `get_directory_name()` och `get_filename()` har tagits bort.
- Funktionen `mark_for_escaping()` och de klasser den använder: `EscapeData`, `EscapeBytes`, `EscapeText`, `EscapeString` och `EscapeUnicode` tas bort.
- Filtret `escape` använder nu `django.utils.html.conditional_escape()`.
- `Manager.use_for_related_fields` har tagits bort.
- Modellens `Manager`-arv följer MRO-arvsreglerna. Kravet på att använda `Meta.manager_inheritance_from_future` för att välja beteendet tas bort.
- Stöd för gammaldags middleware med `settings.MIDDLEWARE_CLASSES` har tagits bort.
