Evgenii Legotckoi
Evgenii Legotckoi4. Dezember 2017 15:41

Django 2.0-Version

Das Django-Team hat die Veröffentlichung von Django 2.0 angekündigt

Diese Version beginnt mit freier semantischer Versionierung in Django, aber es gibt keine wesentlichen Änderungen an der Abwärtskompatibilität (außer dass Python 2.7 entfernt wurde), was in der Version 2.0 erwartet wurde. Das Update sollte das gleiche wie für frühere Versionen sein.

Versionshinweise

Kompatibilität mit Python

Django 2.0 unterstützt die folgenden Python-Versionen: 3.4, 3.5 und 3.6. Diese Versionen werden von den Django-Entwicklern dringend empfohlen und nur die neuesten Versionen dieser Python-Versionsreihen werden offiziell unterstützt.

Django 1.11.x ist die neueste Version, die Python 2.7 unterstützt

Django 2.0 wird die letzte Version sein, die Python 3.4 unterstützt. Wenn Sie vorhaben, Python 3.4 vor dem Ende der Lebensdauer von Django 2.0 (April 2019) bereitzustellen, verwenden Sie Django 1.11 LTS (unterstützt bis April 2020). Bitte beachten Sie jedoch, dass der Support für Python 3.4 Ende März 2019 endet.

Unterstützung für Bibliotheken von Drittanbietern für ältere Versionen von Django

Nach der Veröffentlichung von Django 2.0 schlagen die Entwickler vor, dass Entwickler von Drittanbieteranwendungen die Unterstützung für alle Versionen von Django vor 1.11 einstellen. Gleichzeitig sollen Entwickler ihre Pakettests mit python -Wd ausführen können, um Fehlermeldungen anzuzeigen. Nach dem Beheben der Fehlerwarnung sollte die Anwendung mit Django 2.0 kompatibel sein.


Was ist neu in Django 2.0?

Vereinfachte URL-Routing-Syntax

Mit der neuen Funktion django.urls.path() können wir die URL-Syntax vereinfachen und lesbarer machen. Zum Beispiel dieses Beispiel aus früheren Versionen von Django:

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

Könnte so geschrieben werden

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

Die neue Syntax unterstützt den URL-Parameter-Zwangstyp. In diesem Beispiel nimmt die Ansicht das Argument des Schlüsselworts year als Integer statt als String. Außerdem sind URLs jetzt nicht mehr so eingeschränkt, da das Jahr als ganzzahliger Wert übergeben wird, sodass beispielsweise das Jahr 10000 jetzt übereinstimmt, da ganze Jahreszahlen nicht auf vier Ziffern beschränkt sind, wie dies in einem regulären Ausdruck der Fall wäre.

Die Funktion django.conf.urls.url() aus früheren Versionen ist jetzt als django.urls.re_path() verfügbar. Der alte Speicherort bleibt aus Gründen der Abwärtskompatibilität erhalten. Die alte Funktion django.conf.urls.include() wird jetzt aus django.urls importiert, sodass Sie sie wie from django.urls import include, path, re_path in Ihrem verwenden können URLs-Adressen.

Mobile-freundlicher contrib.admin

Das Administrationspanel unterstützt jetzt alle wichtigen Mobilgeräte. Bei älteren Browsern können verschiedene Stufen der Verschlechterung auftreten.

Fensterausdrücke

Mit dem neuen Fensterausdruck können Sie Abfragen OVER hinzufügen. Sie können Fensterfunktionen und Aggregatfunktionen in einem Ausdruck verwenden.

Geringe Funktion

django.contrib.admin

  • Das neue Attribut ModelAdmin.autocomplete_fields und die Methode ModelAdmin.get_autocomplete_fields() ermöglichen die Verwendung des Select2-Such-Widgets für ForeignKey und ManyToManyField .

django.contrib.auth

  • Die standardmäßige Iterationsanzahl für den PBKDF2-Passwort-Crypter wurde von 36.000 auf 100.000 erhöht.

django.contrib.gis

  • MySQL -Unterstützung für AsGeoJSON -Funktion, GeoHash -Funktion, IsValid -Funktion, isvalid -Suche und Entfernungssuche hinzugefügt.
  • Azimuth - und LineLocatePoint -Funktionen hinzugefügt, die von PostGIS und SpatiaLite unterstützt werden.
  • Jede aus GeoJSON importierte GEOSGeometry hat jetzt ihren eigenen Satz von SRID .
  • Attribut OSMWidget.default_zoom hinzugefügt, um den Standard-Bildzoom einzustellen.
  • Metadaten auf Rastern durch Metadaten, Informationen und Metadatenattribute lesbar und bearbeitbar gemacht.
  • Es ist erlaubt, treiberspezifische Erstellungsoptionen für GDALRaster -Objekte mit papsz_options zu übergeben.
  • Berechtigt, GDALRaster -Objekte im internen virtuellen Dateisystem GDAL zu erstellen. Raster können jetzt erstellt und in In-Memory-Binärdaten konvertiert werden.
  • Neue Methode GDALBand.color_interp() gibt die Farbinterpretation für das Band zurück.

django.contrib.postgres

  • Das neue Argument distinct für ArrayAgg bestimmt, ob die zusammengeführten Werte unterschiedlich sind.
  • Neue Datenbankfunktion RandomUUID liefert UUID der Version 4. Dies erfordert die Verwendung der Erweiterung pgcrypto PostgreSQL , die mit der neuen Migrationsoperation CryptoExtension aktiviert werden kann.
  • django.contrib.postgres.indexes.GinIndex unterstützt jetzt die Optionen fastupdate und gin_pending_list_limit .
  • Mit der neuen Klasse GistIndex können Sie GiST -Indizes in der Datenbank erstellen. Die neue Migrationsoperation BtreeGistExtension installiert die Erweiterung btree_gist , um Unterstützung für nicht integrierte Operatorklassen hinzuzufügen.
  • inspectdb kann jetzt JSONField und verschiedene RangeFields verwenden ( django.contrib.postgres sollte in INSTALLED_APPS sein).

django.contrib.sitemaps

  • Schlüsselwortargument Protokoll zum Konstruktor GenericSitemap hinzugefügt.

Zwischenspeicher

  • cache.set_many() gibt jetzt eine Liste von Schlüsseln zurück, die nicht eingefügt wurden. Bei eingebetteten Back-Ends können fehlgeschlagene Einfügungen nur auf memcached erfolgen.

Dateispeicher

  • File.open() kann beispielsweise als Kontextmanager verwendet werden. mit file.open() als f: .

Formen

  • Neue date_attrs - und time_attrs -Argumente für SplitDateTimeWidget und SplitHiddenDateTimeWidget ermöglichen es Ihnen, verschiedene HTML -Attribute für DateInput - und TimeInput -Subwidgets anzugeben (oder versteckt).
  • Neue Methode Form.errors.get_json_data() gibt Formularfehler als Wörterbuch zurück, das für die Aufnahme in eine JSON-Antwort geeignet ist.

Generische Ansichten

  • Das neue Attribut ContextMixin.extra_context ermöglicht Ihnen, Kontext zu View.as_view() hinzuzufügen.

Verwaltungsbefehle

  • inspectdb übersetzt jetzt unsigned MySQL Integer-Spalten in PositiveIntegerField oder PositiveSmallIntegerField .
  • Neue Option makemessages --add-location definiert das Kommentarformat in PO-Dateien.
  • loaddata kann jetzt von stdin lesen.
  • Neue Option diffsettings - output ermöglicht es Ihnen, die Ausgabe im einheitlichen Format diff zu formatieren.
  • In Oracle kann die Inspektion jetzt AutoField berücksichtigen, wenn die Spalte als Identitätsspalte erstellt wird.
  • MySQL dbshell unterstützt jetzt TLS-Client-Zertifikate.

Migrationen

  • Die neue Option squashmigrations --squashed-name ermöglicht es Ihnen, eine gesquashede Migration zu benennen.

Modelle

  • Neue Datenbankfunktion StrIndex findet den Anfangsindex eines Strings innerhalb eines anderen Strings.
  • In Oracle werden jetzt AutoField und BigAutoField als Identitätsspalten erstellt.
  • Der neue Parameter chunk_size QuerySet.iterator() steuert die Anzahl der Zeilen, die vom Python -Datenbankclient ausgewählt werden, wenn Ergebnisse aus der Datenbank gestreamt werden. Bei Datenbanken, die keine serverseitigen Cursor unterstützen, steuert es die Anzahl der Ergebnisse, die Django vom Datenbankadapter erhält.
  • QuerySet.earliest() , QuerySet.latest() und Meta.get_latest_by ermöglichen jetzt die Bestellung mehrerer Felder.
  • Funktion ExtractQuarter hinzugefügt, um Quartale aus DateField und DateTimeField zu extrahieren.
  • Funktion TruncQuarter hinzugefügt, um DateField und DateTimeField am ersten Tag des Quartals abzuschneiden.
  • Parameter db_tablespace für Klassenindizes hinzugefügt.
  • Wenn die Datenbank ihr eigenes Dauerfeld unterstützt ( Oracle und PostgreSQL ), funktioniert Extract jetzt mit DurationField .
  • QuerySet.select_for_update() Argument hinzugefügt, unterstützt von PostgreSQL und Oracle , um nur Zeilen aus bestimmten Tabellen zu sperren, nicht alle ausgewählten Tabellen. Dies kann nützlich sein, insbesondere wenn select_for_update() in Verbindung mit select_related() verwendet wird.
  • Der neue Parameter field_name QuerySet.in_bulk() ermöglicht es Ihnen, Ergebnisse basierend auf jedem eindeutigen Feld im Modell zu erhalten.
  • CursorWrapper.callproc() verwendet jetzt ein optionales Keyword-Parameter-Wörterbuch, wenn das Backend diese Funktion unterstützt. Die integrierten Server von Django unterstützen nur Oracle.
  • Die neue Methode connection.execute_wrapper() ermöglicht es Ihnen, Wrapper um die Ausführung von Datenbankabfragen zu setzen.
  • Neues Filterargument für Inline-Aggregate ermöglicht es Ihnen, mehreren Aggregaten in denselben Feldern oder Beziehungen unterschiedliche Konventionen hinzuzufügen.
  • Unterstützung für Ausdrücke in Meta.ordering hinzugefügt.
  • Der neue benannte Parameter QuerySet.values_list() ermöglicht es Ihnen, Ergebnisse als benannte Tupel zu erhalten.
  • Die neue Klasse FilteredRelation ermöglicht es Ihnen, ON zu Anfragen hinzuzufügen.

Seitennummerierung

  • Paginator.get_page() hinzugefügt, um eine dokumentierte Vorlage für den Umgang mit ungültigen Seitenzahlen bereitzustellen.

Anfragen und Antworten

  • Die Runserver-Methode für den Webserver unterstützt HTTP 1.1.

Vorlagen

  • Um die Nützlichkeit von Engine.get_default() in Anwendungen von Drittanbietern zu erhöhen, gibt es jetzt die erste Engine zurück, wenn mehrere DjangoTemplates -Engines in TEMPLATES konfiguriert sind, anstatt NotperlyConfigured auszulösen. .
  • Benutzerdefinierte Template-Tags können jetzt nur Schlüsselwortargumente akzeptieren.

Tests

  • Unterstützung für Streaming LiveServerTestCase hinzugefügt.
  • Einstellungen hinzugefügt, die das Setzen von Test-Tablespace-Parametern für Oracle ermöglichen: DATAFILE_SIZE , DATAFILE_TMP_SIZE , DATAFILE_EXTSIZE und DATAFILE_TMP_EXTSIZE .

Validatoren

  • Der neue ProhibitNullCharactersValidator verbietet das Nullzeichen in der Eingabe des Formularfelds CharField und seiner Unterklassen. Bei Schwachstellen-Scan-Tools wurde die Eingabe von Nullzeichen beobachtet. Die meisten Datenbanken verwerfen stillschweigend Nullzeichen, aber psycopg2 2.7+ löst eine Ausnahme aus, wenn versucht wird, ein Nullzeichen in einem char / text-Feld mit PostgreSQL zu speichern.

Änderungen ohne Abwärtskompatibilität in 2.0

Unterstützung für Bytestrings an einigen Stellen entfernt

Um native Python 2-Strings zu unterstützen, mussten ältere Versionen von Django sowohl Bytes als auch Unicode-Strings akzeptieren. Jetzt, da die Python 2-Unterstützung eingestellt wird, sollten Bytes nur noch um E/A-Grenzen herum auftreten (z. B. Verarbeitung von Binärfeldern oder HTTP-Streams). Möglicherweise müssen Sie Ihren Code aktualisieren, um die Verwendung von Bytes auf das absolute Minimum zu beschränken, da Django in bestimmten Codes keine Bytes mehr akzeptiert.

Beispielsweise verwendet reverse() jetzt str() anstelle von force_text() , um die empfangenen Argumente und kwargs zu erzwingen, bevor sie in der URL platziert werden. Für Bytes wird dadurch eine Zeichenfolge mit dem unerwünschten Präfix b sowie zusätzlichen Anführungszeichen (str (b'foo ') - "b'foo") erstellt. Rufen Sie zur Anpassung decode() für eine Bytesequenz auf, bevor Sie sie an reverse() übergeben.

Datenbank-Backend-API

In diesem Abschnitt werden Änderungen beschrieben, die möglicherweise in Datenbank-Backends von Drittanbietern erforderlich sind.

  • Die Methoden DatabaseOperations.datetime_cast_date_sql() , datetime_cast_time_sql() , datetime_trunc_sql() , datetime_extract_sql() und date_interval_sql() geben jetzt nur das auszuführende SQL zurück die Operation statt SQL und Parameterliste.
  • Datenbankdatenbanken von Drittanbietern sollten das Attribut DatabaseWrapper.display_name mit dem Namen der Datenbank hinzufügen, mit der Ihr Backend arbeitet. Django kann es in verschiedenen Nachrichten wie Systemprüfungen verwenden.
  • Das erste Argument für SchemaEditor._alter_column_type_sql() ist jetzt ein Modell, keine Tabelle.
  • Das erste Argument für SchemaEditor._create_index_name() ist jetzt table_name , kein Modell.
  • Um die Unterstützung von FOR UPDATE zu aktivieren, setzen Sie DatabaseFeatures.has_select_for_update_of = True . Wenn die Datenbank erfordert, dass die OF -Argumente Spalten und keine Tabellen sind, legen Sie DatabaseFeatures.select_for_update_of_column = True fest.
  • Um die Unterstützung für Window -Ausdrücke zu aktivieren, setzen Sie den Parameter DatabaseFeatures.supports_over_clause auf True . Möglicherweise müssen Sie die Methoden DatabaseOperations.window_start_rows_start_end() und/oder window_start_range_start_end() anpassen.
  • Datenbankdatenbanken von Drittanbietern müssen das Attribut DatabaseOperations.cast_char_field_without_max_length mit dem Datenbankdatentyp hinzufügen, der in der Funktion Cast für CharField verwendet werden soll, wenn das Argument max_length nicht angegeben ist.
  • Das erste Argument für DatabaseCreation._clone_test_db() und get_test_db_clone_settings() ist jetzt ein Suffix anstelle einer Zahl (falls Sie Signaturen in Ihrem Server aus Konsistenzgründen umbenennen möchten). Nun übergibt django.test diese Werte als Strings statt als Integer.
  • Datenbankdatenbanken von Drittanbietern sollten BaseDatabaseIntrospection eine Stub-basierte Methode DatabaseIntrospection.get_sequences() hinzufügen.

Support für Oracle 11.2 eingestellt

Das Ende des Uplink-Supports für Oracle 11.2 ist Dezember 2020. Django 1.11 wird bis April 2020 unterstützt, was in der Nähe dieses Datums liegt. Django 2.0 unterstützt offiziell Oracle 12.1+.

Standardmäßiger Lesezugriff auf MySQL-Isolationsstufe

Die standardmäßige Isolationsstufe von MySQL, wiederholbare Lesevorgänge, kann bei typischer Django-Nutzung zu Datenverlust führen. Um dies zu verhindern und um die Konsistenz mit anderen Datenbanken zu gewährleisten, ist die Standardisolationsstufe jetzt lesefestgeschrieben. Sie können die Option DATABASES verwenden, um bei Bedarf eine andere Isolationsstufe zu verwenden.

AbstractUser.last_name max_length auf 150 erhöht

Aktivierte Migration für django.contrib.auth.models.User.last_name. Wenn Sie ein Benutzermodell haben, das von AbstractUser erbt, müssen Sie eine Datenbankmigration für Ihr Benutzermodell erstellen und anwenden.

Wenn Sie die 30-Zeichen-Grenze für Nachnamen beibehalten möchten, verwenden Sie ein benutzerdefiniertes Formular:

from django.contrib.auth.forms import UserChangeForm

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

Wenn Sie diese Einschränkung beim Bearbeiten von Benutzern im Admin beibehalten möchten, stellen Sie UserAdmin.form so ein, dass dieses Formular verwendet wird:

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() und last() nach dem Slicing deaktiviert

Das Aufrufen von QuerySet.reverse() oder last() für ein fragmentiertes Abfrageset führt zu unerwarteten Ergebnissen, da der Slice nach der Neuordnung angewendet wird. Dies ist beispielsweise verboten:

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

Formularfelder akzeptieren keine optionalen Argumente mehr als Positionsargumente

Um Laufzeitfehler aufgrund einer falschen Reihenfolge von Formularfeldargumenten zu vermeiden, werden optionale integrierte Formularfeldargumente nicht mehr als Positionsargumente akzeptiert. Zum Beispiel:

forms.IntegerField(25, 10)

löst eine Ausnahme aus und wird ersetzt durch:

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

call_command() prüft die empfangenen Parameter

Nun prüft call_command(), ob der Argumentparser des aufgerufenen Befehls alle an call_command() übergebenen Parameter definiert.

Fügen Sie für benutzerdefinierte Steuerungsbefehle, die Optionen verwenden, die nicht mit parser.add_argument() erstellt wurden, das Attribut stealth_options zum Befehl hinzu:

class MyCommand(BaseCommand):
    stealth_options = ('option_name', ...)

Indizes akzeptieren keine Positionsargumente mehr

Zum Beispiel:

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

löst eine Ausnahme aus und wird ersetzt durch:

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

Foreign Key Constraints sind jetzt in SQLite aktiviert

Dies wird als rückwärtsinkompatible Änderung angezeigt (IntegrityError: FOREIGN KEY-Integritätseinschränkung), wenn versucht wird, eine vorhandene Modellinstanz zu speichern, die gegen die Fremdschlüsseleinschränkung verstößt.

Fremdschlüssel werden jetzt mit DEFERRABLE INITIALLY DEFERRED statt DEFERRABLE IMMEDIATE erstellt. Daher müssen Tabellen möglicherweise neu erstellt werden, um Fremdschlüssel mit der neuen Definition neu zu erstellen, insbesondere wenn Sie dieses Muster verwenden:

from django.db import transaction

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

Wenn Sie den Fremdschlüssel nicht als DEFERRED neu erstellen, schlägt das erste create() fehl, wenn Fremdschlüsseleinschränkungen angewendet werden.

Sichern Sie zuerst Ihre Datenbank! Nach dem Upgrade auf Django 2.0 können Sie die Tabellen mit einem Skript wie dem folgenden neu erstellen:

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)

Dieses Skript wurde nicht umfassend getestet und muss für verschiedene Fälle, z. B. mehrere Datenbanken, angepasst werden. Fühlen Sie sich frei, Verbesserungen vorzunehmen.

Außerdem ist es aufgrund der Änderungsbeschränkung von SQLite-Tabellen nicht erlaubt, RenameModel- und RenameField-Vorgänge an Modellen oder Feldern auszuführen, die von anderen Modellen in einer Transaktion referenziert werden. Um Migrationen mit diesen Vorgängen zuzulassen, müssen Sie das Attribut Migration.atomic auf False setzen.

Sonstig

  • Die Klasse SessionAuthenticationMiddleware wurde entfernt. Es bot keine Funktionalität, da die Sitzungsauthentifizierung bedingungslos in Django 1.10 enthalten ist.
  • Standard-HTTP-Error-Handler (handler404 usw.) sind jetzt Aufrufer anstelle von gepunkteten Python-Pfadzeichenfolgen. Django unterstützt aufrufbare Referenzen, da sie eine bessere Leistung und Debugging-Funktionen bieten.
  • RedirectView deaktiviert NoReverseMatch nicht mehr, wenn pattern_name nicht existiert.
  • Wenn USE_L10N deaktiviert ist, berücksichtigen FloatField und DecimalField jetzt DECIMAL_SEPARATOR und THOUSAND_SEPARATOR während der Validierung. Beispielsweise wird bei den Einstellungen die Eingabe „1.345“ jetzt auf 1345 statt 1.345 umgerechnet:
USE_L10N = False
USE_THOUSAND_SEPARATOR = True
DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = '.'
  • Unterklassen von AbstractBaseUser sind nicht mehr erforderlich, um get_short_name() und get_full_name() zu implementieren. (Basisimplementierungen, die NotImplementedError auslösen, werden entfernt.) Django.contrib.admin verwendet diese Methoden, wenn sie implementiert sind, erfordert sie jedoch nicht. Anwendungen von Drittanbietern, die diese Methoden verwenden, möchten möglicherweise einen ähnlichen Ansatz verfolgen.
  • Die Formatparameter FIRST_DAY_OF_WEEK und NUMBER_GROUPING werden jetzt als Ganzzahlen in der JavaScript- und JSON i18n-Ausgabe gespeichert.
  • assertNumQueries() ignoriert jetzt Anfragen zur Verbindungskonfiguration. Wenn zuvor in einem Test eine neue Datenbankverbindung geöffnet wurde, konnten diese Abfragen als Teil von countNumQueries() eingeschlossen werden.
  • Die Standardgröße des Oracle-Test-Tablespace wurde von 20 MB auf 50 MB erhöht, und die Standardgröße für die automatische Erweiterung wurde von 10 MB auf 25 MB erhöht.
  • Um die Leistung beim Streamen großer Ergebnismengen aus der Datenbank zu verbessern, ruft QuerySet.iterator() jetzt 2000 Zeilen gleichzeitig statt 100 ab. Das alte Verhalten kann mit dem Parameter chunk_size wiederhergestellt werden. Zum Beispiel:
Book.objects.iterator(chunk_size=100)
  • Die Angabe unbekannter Paketnamen im Paketargument in der JavaScriptCatalog -Ansicht löst jetzt einen ValueError anstelle von Stille aus.
  • Der Primärschlüssel einer Modellinstanz erscheint jetzt standardmäßig in der Methode . str () des Modells, z. Frageobjekt (1).
  • makemigrations erkennt jetzt Änderungen am Feld limit_choices_to des Modellparameters. Fügen Sie dies zu Ihren vorhandenen Migrationen hinzu oder akzeptieren Sie eine automatisch generierte Migration für Felder, die es verwenden.
  • Das Ausführen von Abfragen, die automatische räumliche Transformationen erfordern, löst jetzt NotImplementedError für MySQL aus, anstatt Stille zu verwenden, wenn nicht transformierte Geometrien verwendet werden.
  • django.core.exceptions.DjangoRuntimeWarning wurde entfernt. Sie wurde im Cache nur als Zwischenklasse in der CacheKeyWarning -Vererbung von RuntimeWarning verwendet.
  • BaseExpression._output_field in output_field umbenannt. Möglicherweise müssen Sie Benutzerausdrücke aktualisieren.
  • In älteren Versionen kombinieren Shapes und Formulare ihre Medien mit Medien-Widgets, indem sie sie zusammenführen. Die Union versucht nun, die relative Reihenfolge der Elemente in jeder Liste beizubehalten. MediaOrderConflictWarning wird ausgegeben, wenn die Bestellung nicht gespeichert werden kann.
  • django.contrib.gis.gdal.OGRException wurde entfernt. Dies ist seit Django 1.8 ein Alias für GDALException .
  • Die Unterstützung für GEOS 3.3.x ist deaktiviert.
  • Die Art und Weise, wie Daten für GeometryField ausgewählt werden, wurde geändert, um die Leistung zu verbessern, und in unformatierten SQL-Abfragen sollten diese Felder jetzt in connection.ops.select eingeschlossen werden.

Funktion in Version 2.0 veraltet

Kontextargument von Field.from_db_value() und Expression.convert_value()

Die Kontextargumente Field.from_db_value() und Expression.convert_value() werden nicht verwendet, da es sich immer um ein leeres Wörterbuch handelt. Die Signatur beider Methoden lautet nun:

(self, value, expression, connection)

stattdessen:

(self, value, expression, connection, context)

Die Unterstützung für die alte Signatur in benutzerdefinierten Feldern und Ausdrücken wird bis Django 3.0 fortgesetzt.

Sonstig

  • Das Modul django.db.backends.postgresql_psycopg2 wurde zugunsten von django.db.backends.postgresql verworfen. Es war ein Alias in Django 1.9. Dies betrifft nur Code, der direkt aus einem Modul importiert wird. Die Option DATABASES kann weiterhin 'django.db.backends.postgresql_psycopg2' verwenden, obwohl Sie dies vereinfachen können, indem Sie den Namen 'django.db.backends.postgresql' verwenden, der zu Django 1.9 hinzugefügt wurde .
  • django.shortcuts.render_to_response() wurde zugunsten von django.shortcuts.render() verworfen. render() akzeptiert die gleichen Argumente, außer dass es auch eine Anfrage erfordert.
  • Der Wert DEFAULT_CONTENT_TYPE ist veraltet. Es funktioniert nicht gut mit Anwendungen von Drittanbietern und ist veraltet, da HTML5 XHTML größtenteils ersetzt hat.
  • HttpRequest.xreadlines() wurde zugunsten der On-Demand-Iteration verworfen.
  • Das Schlüsselwortargument field_name für QuerySet.earliest() und QuerySet.latest() wurde zugunsten der Übergabe von Feldnamen als Argumente verworfen. Schreiben Sie .earliest('pub_date') anstelle von .earliest(field_name = 'pub_date') .

Funktionalität in Version 2.0 entfernt

Django 2.0 entfernte auch alle Funktionen, die in den Versionen 1.9 und 1.10 als veraltet gekennzeichnet waren.

Für Django empfehle ich Timeweb-Hoster VDS-Server .

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

ПК
  • 2. März 2018 23:41

По поводу упрощённого синтаксиса машрутизации урлов. С тем что увеличивается читабельность и довольно удобно принуждение типов бесспорно. А вот пример с архивом по годам и утверждение, что регулярные выражения как то ограничивали количество цифр, неверно - количество символов ограничивает данный конкретный шаблон, если его переписать как

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

то уже ничего не ограничивается. Да и как может функционал внутри построенный на регулярных выражениях быть более гибким чем регулярные выражения? Тут цель не переплюнуть регулярные выражения в функциональности, а добавить удобства и читабельности.

не отредактировал выражение. вот правильное

url(r'^articles/(?P<year>[0-9]+)/$', views.year_archive),

Это утверждение официальных разработчиков Django в release notes к данному выпуску.

Полагаю, что они хотели этим сказать, что не нужно забивать голову тем, чтобы придумывать регулярное выражение в том случае, когда нужно получить целочисленное значение в URL.

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken