Django 2.2 release notes¶
1 april 2019
Välkommen till Django 2.2!
Dessa release notes 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 tillRemoteUserBackend.configure_user()
, om det accepteras.
django.contrib.gis
¶
django.contrib.postgres
¶
Det nya argumentet
ordering
förArrayAgg
ochStringAgg
bestämmer ordningen på de aggregerade elementen.De nya klasserna
BTreeIndex
,HashIndex
ochSpGistIndex
gör det möjligt att skapaB-Tree
,hash
ochSP-GiST
index i databasen.BrinIndex
har nu parameternautosummarize
.Den nya parametern
search_type
iSearchQuery
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
-kroken initialiserar vyattribut innan den anropardispatch()
. 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 nuDurationField
för Oracle och PostgreSQL, ochAutoField
för SQLite.På Oracle paketeras
dbshell
medrlwrap
, 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örsquashmigrations
.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
ochReverse
, samt många math databasfunktioner.Genom att ställa in den nya parametern
ignore_conflicts
iQuerySet.bulk_create()
tillTrue
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ånDateField
ochDateTimeField
, och den nyaiso_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()
ochModel.delete()
. Detta förbättrar prestandan för autocommit genom att minska antalet rundresor i databasen.Hanteringen av
DISTINCT
-aggregering läggs till i klassenAggregate`
. Genom att lägga tillallow_distinct = True
som ett klassattribut påAggregate
subklasser kan ettdistinct
nyckelordsargument anges vid initialisering för att säkerställa att aggregatfunktionen endast anropas för varje distinkt värde avexpressions
.Metoderna
RelatedManager.add()
,create()
,remove()
,set()
,get_or_create()
ochupdate_or_create()
är nu tillåtna för många-till-många-relationer med mellanliggande modeller. Det nya argumentetthrough_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
tillserializers.deserialize()
. Dessutom hanterarloaddata
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ärcontent_type='application/json'
.Den nya :inställningen:`ORACLE_MANAGED_FILES <TEST_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
ochMaxLengthValidator
accepterar nu en anropbarlimit_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
tillFalse
.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
tillFalse
.Tredjeparts databasbackends måste implementera introspektion för
DurationField
eller sättaDatabaseFeatures.can_introspect_duration_field
tillFalse
.DatabaseFeatures.uses_savepoints
har nu standardvärdetTrue
.Tredjeparts databasbackends måste implementera stöd för partiella index eller sätta
DatabaseFeatures.supports_partial_indexes
tillFalse
.DatabaseIntrospection.table_name_converter()
ochcolumn_name_converter()
tas bort. Tredjeparts databasbackends kan istället behöva implementeraDatabaseIntrospection.identifier_converter()
. I så fall måste de begränsningsnamn somDatabaseIntrospection.get_constraints()
returnerar normaliseras medidentifier_converter()
.SQL-generering för index flyttas från
Index
tillSchemaEditor
och dessaSchemaEditor
-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¶
:ref:``Rättigheter för proxymodeller <proxy-models-permissions-topic>` 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ör550e8400e29b41d4a716446655440000
.I SQLite innehåller
PositiveIntegerField
ochPositiveSmallIntegerField
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 seCHECK 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
ochtruncatewords_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, ochdjango.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ärdenaunknown
,true
ochfalse
istället för1
,2
och3
. 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
ochdjango.utils.http.urlencode()
nu upphov tillTypeError
omNone
skickas som ett värde att koda eftersomNone
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 standardhttps
i stället förhttp
för webbplatskartans URL. Om din webbplats använder http, använd det nya alternativetping_google --sitemap-uses-http
. Om du använder funktionendjango.contrib.sitemaps.ping_google
, sätt det nya argumentetsitemap_uses_https
tillFalse
.runserver
har inte längre stöd förpyinotify
(ersatt av Watchman).Aggregatfunktionerna
Avg
,StdDev
ochVariance
returnerar nu enDecimal
istället för enfloat
när indata ärDecimal
.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 icache.delete()
ellercache.get()
uppstår nuValueError
.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ördatetime.timezone
.Det odokumenterade aliaset
QuerySetPaginator
fördjango.core.paginator.Paginator
är föråldrat.Modell- och formulärfälten
FloatRangeField
idjango.contrib.postgres
är utdaterade till förmån för ett nytt namn,DecimalRangeField
, för att matcha den underliggande datatypennumrange
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ändManifestStaticFilesStorage
eller en molnlagring från tredje part istället.RemoteUserBackend.configure_user()
skickas nurequest
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
ochTestCase.multi_db
är föråldrade till förmån förSimpleTestCase.databases
,TransactionTestCase.databases
ochTestCase.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 medallow_database_queries=True
ochmulti_db=True
kan uppnås genom att ställa indatabases='__all__'
.