Django 1.10リリースノート—Djangoドキュメント

提供:Dev Guides
< DjangoDjango/docs/2.2.x/releases/1.10
移動先:案内検索

Django1.10リリースノート

2016年8月1日

Django 1.10へようこそ!

これらのリリースノートには、の新機能と、Django1.9以前のバージョンからアップグレードするときに注意が必要な後方互換性のない変更が含まれています。 非推奨サイクルの終わりに達したいくつかの機能削除し、いくつかの機能の非推奨プロセスを開始しました。

既存のプロジェクトを更新する場合は、 Djangoを新しいバージョンにアップグレードするガイドを参照してください。

Pythonの互換性

Django 1.9と同様に、Django1.10にはPython2.7、3.4、または3.5が必要です。 強くお勧めします。各シリーズの最新リリースのみを公式にサポートします。


Django1.10の新機能

PostgreSQLの全文検索

django.contrib.postgresには、データベース関数のコレクションが含まれるようになり、全文検索エンジンを使用できるようになりました。 リレーショナルデータベースの複数のフィールドを検索したり、検索を他のルックアップと組み合わせたり、さまざまな言語構成と重み付けを使用したり、関連性によって結果をランク付けしたりできます。

:lookup: `trigram_similar` ルックアップ、および TrigramSimilarity および TrigramDistance 式を使用した、トリグラムのサポートも含まれるようになりました。


新しいスタイルのミドルウェア

../../topics/http/middleware DEP 0005 で説明されている古いスタイルのミドルウェアの厳密な要求/応答階層化の欠如を解決するために、新しいスタイルのミドルウェアが導入されました。 改善を利用するには、古いカスタムミドルウェア適応し、MIDDLEWARE_CLASSES設定から新しい:setting: `MIDDLEWARE` 設定に切り替える必要があります。


Unicodeユーザー名の公式サポート

django.contrib.authUser モデルは、元々、ユーザー名にASCII文字と数字のみを受け入れていました。 意図的な選択ではありませんでしたが、Python3を使用する場合は常にUnicode文字が受け入れられてきました。

ユーザー名バリデーターは、Python3でのみデフォルトでUnicode文字を明示的に受け入れるようになりました。

カスタムユーザーモデルは、新しい ASCIIUsernameValidator または UnicodeUsernameValidator を使用できます。


マイナーな機能

django.contrib.admin

  • サブパスで実行されているサイトの場合、各管理ページの上部にある[サイトの表示]リンクのデフォルトの URLは、設定されている場合、/ではなく、request.META['SCRIPT_NAME']を指すようになります。 ]。
  • オブジェクトを追加または編集した後に表示される成功メッセージに、オブジェクトの変更フォームへのリンクが含まれるようになりました。
  • 必要に応じてContent-Security-Policy HTTPヘッダーを有効にできるように、すべてのインラインJavaScriptが削除されています。
  • 新しい InlineModelAdmin.classes 属性を使用すると、インラインフィールドセットでクラスを指定できます。 collapseクラスのインラインは最初に折りたたまれ、ヘッダーには小さな「表示」リンクがあります。
  • ユーザーに追加権限がない場合、モデルのチェンジリストのobject-toolsブロックがレンダリングされるようになりました(もちろん、追加ボタンはありません)。 これにより、この場合、カスタムツールを簡単に追加できます。
  • LogEntry モデルは、変更メッセージをJSON構造に格納するようになり、現在のアクティブな言語を使用してメッセージを動的に翻訳できるようになりました。 新しいLogEntry.get_change_message()メソッドが、変更メッセージを取得するための推奨される方法になりました。
  • ModelAdmin.raw_id_fieldsのフィールドで選択されたオブジェクトに、オブジェクトの変更フォームへのリンクが追加されました。
  • フィールドがnull許容の場合、DateFieldListFilterに「日付なし」と「日付あり」の選択肢を追加しました。
  • adminに埋め込まれたjQueryライブラリがバージョン2.1.4から2.2.3にアップグレードされます。


django.contrib.auth

  • Argon2パスワードハッシュのサポートが追加されました。 PBKDF2よりも推奨されますが、サードパーティのライブラリが必要なため、デフォルトではありません。
  • PBKDF2パスワードハッシャーのデフォルトの反復回数が25%増加しました。 この下位互換性のある変更は、django.contrib.auth.hashers.PBKDF2PasswordHasherをサブクラス化してデフォルト値を変更したユーザーには影響しません。
  • django.contrib.auth.views.logout()ビューは、Safariがリダイレクトをキャッシュし、ユーザーがログアウトできないという問題を防ぐために、「キャッシュなし」ヘッダーを送信します。
  • オプションのbackend引数を django.contrib.auth.login()に追加して、資格情報なしで使用できるようにしました。
  • 新しい:setting: `LOGOUT_REDIRECT_URL` 設定は、ビューがnext_page引数を取得しない場合に、django.contrib.auth.views.logout()ビューのリダイレクトを制御します。
  • django.contrib.auth.views.login()ビューの新しいredirect_authenticated_userパラメーターを使用すると、ログインページにアクセスする認証済みユーザーをリダイレクトできます。
  • 新しい AllowAllUsersModelBackendAllowAllUsersRemoteUserBackend は、User.is_activeの値を無視しますが、 ModelBackendRemoteUserBackend は非アクティブなユーザーを拒否するようになりました。


django.contrib.gis

  • 距離ルックアップは、距離値パラメーターとして式を受け入れるようになりました。
  • 新しい GEOSGeometry.unary_union プロパティは、このジオメトリのすべての要素の和集合を計算します。
  • GEOSGeometry.covers()バイナリ述語を追加しました。
  • GDALBand.statistics()メソッドと mean および std 属性を追加しました。
  • SpatiaLiteの MakeLine アグリゲートと GeoHash 関数のサポートが追加されました。
  • MySQLの DifferenceIntersection 、および SymDifference 関数のサポートが追加されました。
  • 空のGEOSジオメトリをインスタンス化するためのサポートが追加されました。
  • WKTWriter の新しい trim および precision プロパティを使用すると、WKTの座標の小数部分の出力を制御できます。
  • LineString.closed および MultiLineString.closed プロパティが追加されました。
  • GeoJSONシリアライザーは、特定のフィールドが指定されていない場合、propertiesディクショナリ内のオブジェクトの主キーを出力するようになりました。
  • GDALBand.data()メソッドで入力データを複製する機能が追加されました。 バンドデータを繰り返し値で効率的に更新できるようになりました。
  • すべてPostGIS用のデータベース関数 IsValidMakeValid 、および:lookup: `isvalid` ルックアップを追加しました。 これにより、データベース側で無効なジオメトリをフィルタリングおよび修復できます。
  • すべての空間ルックアップのラスターサポートが追加されました。


django.contrib.postgres

  • 便宜上、 HStoreField はそのキーと値を文字列にキャストするようになりました。


django.contrib.sessions


django.contrib.sites


django.contrib.staticfiles

  • :ttag: `static` テンプレートタグは、INSTALLED_APPSにある場合、django.contrib.staticfilesを使用するようになりました。 これは、({% load staticfiles %}または{% load static from staticfiles %}の代わりに)常に{% load static %}を使用でき、staticfilesかどうかを気にしないサードパーティアプリで特に役立ちます。 ]アプリがインストールされています。
  • カスタムAppConfigを使用すると、 [[Django/docs/2.2.x/ref/contrib/staticfiles#customize-staticfiles-ignore-patterns|]] collectstatic --ignoreオプションをより簡単にカスタマイズできます。


キャッシュ

  • ファイルベースのキャッシュバックエンドは、最高のピクルスプロトコルを使用するようになりました。


CSRF

  • デフォルトの:setting: `CSRF_FAILURE_VIEW`views.csrf.csrf_failure()は、オプションのtemplate_nameパラメーターを受け入れ、デフォルトで'403_csrf.html'になり、レンダリングに使用されるテンプレートを制御します。ページ。
  • BREACH 攻撃から保護するために、CSRF保護メカニズムは、リクエストごとにフォームトークン値を変更するようになりました(さまざまなトークンの検証に使用できる不変のシークレットを保持します)。


データベースバックエンド

  • 時間データの減算は、すべてのバックエンドで統合されました。
  • データベースがサポートしている場合、バックエンドはDatabaseFeatures.can_return_ids_from_bulk_insert=Trueを設定し、DatabaseOperations.fetch_returned_insert_ids()を実装して、QuerySet.bulk_create()を使用して作成されたオブジェクトに主キーを設定できます。
  • データベースバックエンドがselfを変更せずにカスタマイズします。これは、異なるデータベースバックエンドを使用する場合は安全ではありません。 例については、 Func.as_sql()arg_joinerおよび**extra_contextパラメーターを参照してください。


ファイルストレージ


フォーム

  • フォームとウィジェットMediaは、インストールされている場合、 django.contrib.staticfiles を使用して提供されるようになりました。
  • CharField によってレンダリングされた<input>タグには、フィールドにmin_lengthがある場合、minlength属性が含まれるようになりました。
  • 必須のフォームフィールドにrequired HTML属性が追加されました。 新しい Form.use_required_attribute 属性をFalseに設定して、無効にします。 required属性は、フォームセットを追加および削除するときにブラウザーの検証が正しくない可能性があるため、フォームセットのフォームには含まれていません。


一般的なビュー

  • View クラスをdjango.viewsからインポートできるようになりました。


国際化


管理コマンド

  • call_command()は、command.handle()メソッドから返された値を返すようになりました。
  • 新しいcheck --fail-levelオプションを使用すると、コマンドをゼロ以外のステータスで終了させるメッセージレベルを指定できます。
  • 新しいmakemigrations --checkオプションは、移行なしのモデル変更が検出されたときに、コマンドをゼロ以外のステータスで終了させます。
  • :djadmin: `makemigrations` は、生成する移行ファイルへのパスを表示するようになりました。
  • shell --interfaceオプションは、pythonを受け入れて、「プレーンな」Pythonインタープリターの使用を強制するようになりました。
  • 新しいshell --commandオプションを使用すると、インタラクティブシェルを開く代わりに、コマンドをDjangoとして実行して終了できます。
  • 具体的な親なしでプロキシモデルが指定されている場合(出力がない場合)、:djadmin: `dumpdata` に警告を追加しました。
  • :djadmin: `runserver` のようにコマンドで警告を出力する場合は、新しい BaseCommand.requires_migrations_checks 属性をTrueに設定できます。ディスク上の移行の数がデータベース内の移行と一致しません。
  • テストを支援するために、 call_command()は最初の引数としてコマンドオブジェクトを受け入れるようになりました。
  • :djadmin: `shell` コマンドは、libeditを使用するシステムでのタブ補完をサポートします。 マックOS。
  • :djadmin: `inspectdb` コマンドを使用すると、引数として名前を指定することにより、検査するテーブルを選択できます。


移行

  • enum.Enumオブジェクトのシリアル化のサポートが追加されました。
  • RunSQL および RunPython 操作にelidable引数を追加して、移行を潰すときにそれらを削除できるようにしました。
  • Migrationatomic属性を設定することにより、非アトミックマイグレーションのサポートが追加されました。
  • migrateおよびmakemigrationsコマンドは、一貫した移行履歴をチェックするようになりました。 適用された移行の適用されていない依存関係が見つかった場合、InconsistentMigrationHistoryが発生します。
  • pre_migrate()および post_migrate()シグナルは、移行planおよびappsをディスパッチするようになりました。


モデル

  • プロキシモデルからの逆外部キーは、具象クラスに伝播されるようになりました。 プロキシモデルを指す ForeignKey によってアタッチされた逆の関係は、プロキシモデルクラスの記述子としてアクセスできるようになり、クエリセットフィルタリングで参照できるようになりました。
  • 新しい Field.rel_db_type()メソッドは、別のフィールドを指すForeignKeyOneToOneFieldなどのフィールドのデータベース列データ型を返します。
  • arity クラス属性が Func に追加されました。 この属性を使用して、関数が受け入れる引数の数を設定できます。
  • 1から9223372036854775807までの数値に適合することが保証されていることを除いて、 AutoField とほぼ同じように機能する BigAutoField を追加しました。
  • QuerySet.in_bulk()は、クエリセット内のすべてのオブジェクトを返すために引数なしで呼び出すことができます。
  • related_query_name は、'%(app_label)s'および'%(class)s'文字列を使用したアプリラベルおよびクラス補間をサポートするようになりました。
  • 抽象基本クラスから継承されたモデルフィールドのオーバーライドを許可しました。
  • prefetch_related_objects()関数がパブリックAPIになりました。
  • QuerySet.bulk_create()は、PostgreSQLを使用するときにオブジェクトの主キーを設定します。
  • Cast データベース機能を追加しました。
  • プロキシモデルは、共通の非抽象親クラスを共有する複数のプロキシモデルを継承できるようになりました。
  • 日時コンポーネントを年や時間などの整数として抽出する Extract 関数が追加されました。
  • 日付または日時を重要なコンポーネントに切り捨てるための Trunc 関数が追加されました。 1日あたりの売上や1時間あたりの売上などのクエリを有効にします。
  • Model.__init__()は、キーワード引数から仮想フィールドの値を設定するようになりました。
  • 新しい Meta.base_manager_name および Meta.default_manager_name オプションを使用すると、それぞれ _base_manager および _default_manager を制御できます。


リクエストとレスポンス

  • request.userをデバッグビューに追加しました。
  • HttpResponse メソッド読み取り可能()および seekable()を追加して、インスタンスをストリームのようなオブジェクトにし、io.TextIOWrapperでラップできるようにしました。
  • CONTENT_TYPEヘッダーから解析される HttpRequest.content_type および content_params 属性が追加されました。
  • request.COOKIESのパーサーは、ブラウザーの動作によりよく一致するように簡略化されています。 request.COOKIESには、 RFC 6265 に従って無効なCookieが含まれる可能性がありますが、document.cookieを介して設定できます。


シリアル化

  • django.core.serializers.json.DjangoJSONEncoderは、通常、翻訳可能なコンテンツに使用されるレイジー文字列をシリアル化する方法を認識しました。


テンプレート

  • autoescapeオプションを DjangoTemplates バックエンドと Engine クラスに追加しました。
  • isおよびis not比較演算子を:ttag: `if` タグに追加しました。
  • :tfilter: `dictsort` が、指定されたインデックスの要素ごとにリストのリストを並べ替えることができるようになりました。
  • debug()コンテキストプロセッサには、デフォルトのエイリアスだけでなく、すべてのデータベースエイリアスのクエリが含まれています。
  • :ttag: `extends` および:ttag:` include` テンプレートタグの文字列引数の相対パスサポートが追加されました。


テスト

  • バグをより適切にキャッチするために、 TestCase は、各テストの最後に延期可能なデータベース制約をチェックするようになりました。
  • テストとテストケースは、タグでマークされ、新しいtest --tagおよびtest --exclude-tagオプションで選択的に実行できます。
  • django.contrib.sessions:setting: `INSTALLED_APPS` にない場合でも、ログインしてテストクライアントでセッションを使用できるようになりました。


URL

  • django.setup()に追加すると、要求/応答サイクルの外で発生するURL解決が可能になります(例: 管理コマンドおよびスタンドアロンスクリプトで)設定時に:setting: `FORCE_SCRIPT_NAME` を考慮に入れます。


バリデーター

  • URLValidator は、 RFC 1034 ごとに、ドメイン名ラベルの長さを63文字に制限し、ドメイン名の全長を253文字に制限するようになりました。
  • int_list_validator()は、オプションのallow_negativeブールパラメーターを受け入れるようになりました。デフォルトはFalseで、負の整数を許可します。


1.10での後方互換性のない変更

警告

このセクションで概説されている変更に加えて、1.10 で削除された機能で、非推奨サイクルの終わりに達したために削除された機能を確認してください。 特定の機能の非推奨タイムライン内にコードを更新しなかった場合、その削除は後方互換性のない変更として表示される場合があります。


データベースバックエンドAPI

  • GISのAreaFieldは、実際には任意の数値Python型である可能性がある、指定されていない基になる数値型を使用します。 データベースから取得したdecimal.Decimal値がfloatに変換されるようになり、GISライブラリで使用される値と簡単に組み合わせることができるようになりました。
  • 時間減算を有効にするには、supports_temporal_subtractionデータベース機能フラグをTrueに設定し、DatabaseOperations.subtract_temporals()メソッドを実装する必要があります。 このメソッドは、 DurationField の格納に使用されるデータ型のlhs引数とrhs引数の差をマイクロ秒単位で計算するために必要なSQLとパラメーターを返す必要があります。


_meta.get_fields()は、プロキシモデルの一貫したリバースフィールドを返します

Django 1.10より前は、 get_fields()メソッドは、プロキシモデルで呼び出されたときに、プロキシされた具象クラスと比較して異なるリバースフィールドを返していました。 この不整合は、どちらの場合も具象クラスまたはそのプロキシの1つを指すフィールドの完全なセットを返すことで修正されました。


AbstractUser.username max_length increased to 150

django.contrib.auth.models.User.username の移行が含まれています。 AbstractUserから継承するカスタムユーザーモデルがある場合は、ユーザーモデルのデータベース移行を生成して適用する必要があります。

電子メールアドレス(254文字に制限されている)をユーザー名としてより簡単に使用できるようにするために、254文字に増やすことを検討しましたが、MySQLの制限のために拒否しました。 utf8mb4エンコーディング(適切なUnicodeサポートに推奨)を使用する場合、MySQLはデフォルトで191文字の一意のインデックスしか作成できません。 したがって、より長い長さが必要な場合は、カスタムユーザーモデルを使用してください。

ユーザー名の30文字の制限を維持する場合は、ユーザーを作成するとき、またはユーザー名を変更するときにカスタムフォームを使用します。

from django.contrib.auth.forms import UserCreationForm

class MyUserCreationForm(UserCreationForm):
    username = forms.CharField(
        max_length=30,
        help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.',
    )

管理者でこの制限を維持したい場合は、次のフォームを使用するようにUserAdmin.add_formを設定してください。

from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User

class UserAdmin(BaseUserAdmin):
    add_form = MyUserCreationForm

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

PostgreSQL9.1のサポートを終了しました

PostgreSQL9.1のアップストリームサポートは2016年9月に終了します。 結果として、Django 1.10は、PostgreSQL9.2を公式にサポートする最小バージョンとして設定します。


runserver出力はロギングを通過します

runserverコマンドの要求と応答の処理は、sys.stderrではなく django.server ロガーに送信されます。 Djangoのロギング構成を無効にするか、独自のロギング構成でオーバーライドする場合、その出力を表示するには、適切なロギング構成を追加する必要があります。

'formatters': {
    'django.server': {
        '()': 'django.utils.log.ServerFormatter',
        'format': '[%(server_time)s] %(message)s',
    }
},
'handlers': {
    'django.server': {
        'level': 'INFO',
        'class': 'logging.StreamHandler',
        'formatter': 'django.server',
    },
},
'loggers': {
    'django.server': {
        'handlers': ['django.server'],
        'level': 'INFO',
        'propagate': False,
    }
}

auth.CustomUserおよびauth.ExtensionUserテストモデルが削除されました

Django 1.8でcontribアプリの移行が導入されて以来、これらのカスタムユーザーテストモデルのテーブルは作成されなくなり、テストコンテキストで使用できなくなりました。


Djangoの外部でモデルを選択解除するときに、Appsレジストリが自動入力されなくなりました

モデルの選択を解除するときに、アプリのレジストリが自動入力されなくなりました。 これは、django.setup()を呼び出さずに、RQワーカーなどのDjangoの外部でモデルの選択を解除できるようにする試みとして、Django 1.7.2で追加されましたが、デッドロックの可能性があります。 RQの場合にコードを適合させるために、django.setup()を呼び出す独自のワーカースクリプト提供できます。


null以外の外部キーフィールドのnull割り当てチェックを削除しました

古いバージョンでは、Noneをnull許容でないForeignKeyまたはOneToOneFieldに割り当てると、ValueError('Cannot assign None: "model.field" does not allow null values.')が発生しました。 同様のチェックがない他のモデルフィールドとの一貫性を保つために、このチェックは削除されています。


デフォルトのPASSWORD_HASHERS設定から弱いパスワードハッシャーを削除しました

Django 0.90は、無塩のMD5としてパスワードを保存しました。 Django 0.91は、ユーザーがログインしたときにパスワードが自動的にアップグレードされるソルトSHA1のサポートを追加しました。 Django 1.4は、デフォルトのパスワードハッシャーとしてPBKDF2を追加しました。

MD5またはSHA1(ソルトされている場合でも)でエンコードされたパスワードを使用する古いDjangoプロジェクトがある場合、これらは今日のハードウェアでかなり簡単に解読される可能性があることに注意してください。 Djangoユーザーに弱いハッシャーの継続的な使用を認めさせるために、次のハッシャーがデフォルトの:setting: `PASSWORD_HASHERS` 設定から削除されています。

'django.contrib.auth.hashers.SHA1PasswordHasher'
'django.contrib.auth.hashers.MD5PasswordHasher'
'django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher'
'django.contrib.auth.hashers.UnsaltedMD5PasswordHasher'
'django.contrib.auth.hashers.CryptPasswordHasher'

ラップされたパスワードハッシュを使用して、データベースのハッシュを強化することを検討してください。 それが不可能な場合は、:setting: `PASSWORD_HASHERS` 設定をプロジェクトに追加し、必要なハッシャーを追加し直します。

データベースに次のような削除されたハッシャーがあるかどうかを確認できます。

from django.contrib.auth import get_user_model
User = get_user_model()

# Unsalted MD5/SHA1:
User.objects.filter(password__startswith='md5$$')
User.objects.filter(password__startswith='sha1$$')
# Salted MD5/SHA1:
User.objects.filter(password__startswith='md5$').exclude(password__startswith='md5$$')
User.objects.filter(password__startswith='sha1$').exclude(password__startswith='sha1$$')
# Crypt hasher:
User.objects.filter(password__startswith='crypt$$')

from django.db.models import CharField
from django.db.models.functions import Length
CharField.register_lookup(Length)
# Unsalted MD5 passwords might not have an 'md5$$' prefix:
User.objects.filter(password__length=32)

Field.get_prep_lookup()およびField.get_db_prep_lookup()メソッドが削除されました

これらのメソッドのいずれかを実装するカスタムフィールドがある場合は、そのカスタムルックアップを登録します。 例えば:

from django.db.models import Field
from django.db.models.lookups import Exact

class MyField(Field):
    ...

class MyFieldExact(Exact):
    def get_prep_lookup(self):
        # do_custom_stuff_for_myfield
        ....

MyField.register_lookup(MyFieldExact)

django.contrib.gis

  • SpatiaLite <3.0およびGEOS <3.3のサポートは終了しました。
  • django.contrib.gis.utils.add_srs_entry()add_postgis_srs()下位互換性エイリアスが削除されました。
  • Oracle / GISで、 Area 集計関数がdecimal.Decimalではなくfloatを返すようになりました。 (それはまだ平方メートルのメジャーに包まれています。)
  • デフォルトの GEOSGeometry 表現(WKT出力)はデフォルトでトリミングされています。 つまり、POINT (23.0000000000000000 5.5000000000000000)の代わりに、POINT (23 5.5)を取得します。


リクエスト本文の最大サイズとGET / POSTパラメータの数は制限されています

2つの新しい設定は、大規模なリクエストによるサービス拒否攻撃を軽減するのに役立ちます。

異常に大きなフォーム投稿を受け取るアプリケーションは、これらの設定を調整する必要がある場合があります。


その他

  • QuerySetrepr()は、デバッグ時にプレーンリストから明確にするために<QuerySet >でラップされます。
  • utils.version.get_version()は、 PEP 440 準拠のリリース候補バージョンを返します(例: 「1.10c1」ではなく「1.10rc1」)。
  • CSRFトークン値は、64文字の英数字の文字列である必要があります。 古いバージョンのDjangoでデフォルトで設定されている32文字の英数字の値は、64文字の文字列に自動的に置き換えられます。 他の値は無効と見なされます。 これは、これらのトークンを置き換える開発者またはユーザーにのみ影響します。
  • LOGOUT_URL設定は、Djangoが1.0より前から使用していないため、削除されています。 プロジェクトで使用する場合は、プロジェクトの設定に追加できます。 デフォルト値は'/accounts/logout/'でした。
  • HttpResponse に渡されるファイルやジェネレーターなど、close()メソッドを持つオブジェクトは、WSGIサーバーが応答でclose()を呼び出すときではなく、すぐに閉じられるようになりました。
  • QuerySet.update_or_create()の冗長なtransaction.atomic()呼び出しが削除されます。 これは、TransactionTestCase.assertNumQueries()によってテストされるクエリ数に影響を与える可能性があります。
  • BaseCommand.execute(**options)skip_validationのサポートが削除されました。 代わりにskip_checks(Django 1.7で追加)を使用してください。
  • :djadmin: `loaddata` は、指定されたフィクスチャファイルが見つからない場合に警告を表示する代わりに、CommandErrorを発生させるようになりました。
  • LogEntry.change_message属性に直接アクセスする代わりに、現在の言語でメッセージを提供するLogEntry.get_change_message()メソッドを呼び出すことをお勧めします。
  • 存在しないtemplate_nameが指定されている場合、デフォルトのエラービューでTemplateDoesNotExistが発生するようになりました。
  • SelectおよびSelectMultipleウィジェットのrender()メソッドの未使用のchoicesキーワード引数が削除されました。 render_options()メソッドのchoices引数も削除され、selected_choicesが最初の引数になります。
  • 延期可能なデータベース制約に違反するテストは、延期可能な制約をサポートするデータベースで実行するとエラーになるようになりました。
  • 組み込みの管理コマンドは、optionsのキーのインデックスを使用するようになりました。 options.get()の代わりにoptions['verbosity']が使用され、型強制が実行されなくなりました。 これは、 call_command()の代わりにCommand.execute()(デフォルト値を設定する引数パーサーをバイパスする)を使用してコマンドを呼び出す場合に問題になる可能性があります。 Command.execute()を呼び出す代わりに、コマンドオブジェクトを最初の引数としてcall_command()に渡します。
  • ModelBackend および RemoteUserBackend は非アクティブなユーザーを拒否するようになりました。 つまり、非アクティブなユーザーはログインできず、is_active=TrueからFalseに切り替えるとログアウトされます。 以前の動作が必要な場合は、代わりに:setting: `AUTHENTICATION_BACKENDS` の新しい AllowAllUsersModelBackend または AllowAllUsersRemoteUserBackend を使用してください。
  • 以前の変更に照らして、テストクライアントの login()メソッドは、非アクティブなユーザーを常に拒否するわけではなく、代わりにこの決定を認証バックエンドに委任します。 force_login()も決定を認証バックエンドに委任するため、デフォルトのバックエンドを使用している場合は、アクティブユーザーを使用する必要があります。
  • django.views.i18n.set_language()は、AJAXリクエストに対して204ステータスコードを返す場合があります。
  • RangeFieldbase_field属性は、フィールドのインスタンスではなく、フィールドのタイプになりました。 RangeField のカスタムサブクラスを作成した場合は、base_field属性を変更する必要があります。
  • ミドルウェアクラスは、最初の要求時ではなく、サーバーの起動時に初期化されるようになりました。
  • カスタムユーザーモデルでis_authenticated()またはis_anonymous()をオーバーライドする場合は、非推奨ノートの説明に従って、それらを属性またはプロパティに変換する必要があります。
  • ModelAdmin.save_as = True を使用する場合、[新規として保存]ボタンは、モデルの変更リストではなく、新しいオブジェクトの変更ビューにリダイレクトされるようになりました。 以前の動作が必要な場合は、新しい ModelAdmin.save_as_continue 属性をFalseに設定します。
  • 必須のフォームフィールドにrequired HTML属性が追加されました。 Form.use_required_attribute 属性をFalseに設定して、無効にします。 ブラウザの検証が必要ない場合は、novalidate属性を<form>に追加することもできます。 カスタムウィジェットのrequired属性を無効にするには、 Widget.use_required_attribute()メソッドをオーバーライドします。
  • WSGIハンドラーは、HEAD要求またはstatus_codeが100-199、204、または304の応答から応答のコンテンツを削除しなくなりました。 ほとんどのWebサーバーは、すでにこの動作を実装しています。 Djangoテストクライアントを使用して取得された応答には、引き続きこれらの「応答修正」が適用されます。
  • Model.__init__()は、遅延フィールドの値としてdjango.db.models.DEFERREDを受け取るようになりました。
  • QuerySet.defer()を使用すると、動的モデルクラスとしてModel._deferred属性が削除され、only()が削除されます。
  • Storage.save()は、'\''/'に置き換えなくなりました。 これはストレージ固有の実装の詳細であるため、この動作は FileSystemStorage に移動されます。 この動作に依存するカスタムストレージの実装を持つWindowsユーザーは、カスタムストレージのsave()メソッドで実装する必要があります。
  • プライベート FileField メソッドget_directory_name()およびget_filename()は呼び出されなくなりました(現在は非推奨です)。これは、カスタムフィールドでこれらのメソッドをオーバーライドするユーザーにとって後方互換性のない変更です。 このようなコードを適応させるには、代わりにFileField.generate_filename()または Storage.generate_filename()をオーバーライドします。 upload_to も使用できる場合があります。
  • AdminEmailHandlerによって送信されるメールの件名は、989文字で切り捨てられなくなりました。 限られた長さを頼りにしていた場合は、自分で主題を切り捨ててください。
  • プライベート式django.db.models.expressions.DateおよびDateTimeは削除されました。 新しい Trunc 式は同じ機能を提供します。
  • _base_managerおよび_default_manager属性は、モデルインスタンスから削除されます。 それらはモデルクラスで引き続きアクセス可能です。
  • モデルインスタンスの削除されたフィールドへのアクセス。 del obj.fieldの後、AttributeErrorを上げる代わりに、フィールドの値をリロードします。
  • AbstractBaseUserをサブクラス化し、clean()をオーバーライドする場合は、必ずsuper()を呼び出すようにしてください。 AbstractBaseUser.normalize_username()は、新しい AbstractBaseUser.clean()メソッドで呼び出されます。
  • プライベートAPI django.forms.models.model_to_dict()は、ManyToManyFieldの主キーのリストではなく、クエリセットを返します。
  • django.contrib.staticfilesがインストールされている場合、:ttag: `static` テンプレートタグは、値をSTATIC_ROOTと単純に結合するのではなく、staticfilesストレージを使用してURLを構築します。 ]。 新しいアプローチはURLをエンコードします。これは、パスにフラグメントを含める場合など、後方互換性がない可能性があります。 {% static 'img.svg#fragment' %}#%23としてエンコードされているため。 適応するには、フラグメントをテンプレートタグの外側に移動します:{% static 'img.svg' %}#fragment
  • :setting: `USE_L10N`Trueの場合、:tfilter:` date` および:tfilter: `time` [にローカリゼーションが適用されるようになりました。 X132X]は、フォーマット文字列が指定されていない場合にフィルタリングします。 同じ名前の設定の代わりに、アクティブなロケールのDATE_FORMATおよびTIME_FORMAT指定子が使用されます。


1.10で廃止された機能

逆外部キーまたは多対多関係への直接割り当て

直接割り当てを使用して関連オブジェクトを割り当てる代わりに:

>>> new_list = [obj1, obj2, obj3]
>>> e.related_set = new_list

Django1.9で追加された set()メソッドを使用します。

>>> e.related_set.set([obj1, obj2, obj3])

これにより、暗黙的な保存につながる割り当てに関する混乱を防ぐことができます。


タイムゾーンに対応しないストレージ API

古い、タイムゾーンに対応していないメソッドaccessed_time()created_time()、およびmodified_time()は非推奨になり、新しいget_*_time()メソッドが優先されます。

サードパーティのストレージバックエンドは、新しいメソッドを実装し、古いメソッドを非推奨としてマークする必要があります。 それまでは、ベース Storage クラスの新しいget_*_time()メソッドは、必要に応じて古いメソッドからdatetimeを変換し、そうすると非推奨の警告を発します。

サードパーティのストレージバックエンドは、以前のバージョンのDjangoをサポートしたい限り、古いメソッドを保持できます。


django.contrib.gis

  • GEOSGeometryget_srid()およびset_srid()メソッドは非推奨になり、 srid プロパティが優先されます。
  • Point [ X93X]は非推奨になり、xy、およびzプロパティが優先されます。
  • Pointget_coords()およびset_coords()メソッドは非推奨になり、tupleプロパティが優先されます。
  • MultiPolygoncascaded_unionプロパティは非推奨になり、 unary_union プロパティが優先されます。
  • django.contrib.gis.utils.precision_wkt()関数は非推奨になり、 WKTWriter が優先されます。


CommaSeparatedIntegerFieldモデルフィールド

CommaSeparatedIntegerFieldは非推奨になり、 validate_comma_separated_integer_list()バリデーターで CharField が優先されます。

from django.core.validators import validate_comma_separated_integer_list
from django.db import models

class MyModel(models.Model):
    numbers = models.CharField(..., validators=[validate_comma_separated_integer_list])

Oracleを使用している場合、CharFieldCommaSeparatedIntegerFieldVARCHAR2)とは異なるデータベースフィールドタイプ(NVARCHAR2)を使用します。 データベースの設定によっては、これは異なるエンコーディングを意味する場合があり、したがって同じコンテンツに対して異なる長さ(バイト単位)を意味する場合があります。 保存した値がNVARCHAR2の4000バイト制限より長い場合は、代わりにTextFieldNCLOB)を使用する必要があります。 この場合、フィールドでグループ化されたクエリがある場合(例: 集計でモデルに注釈を付けるか、distinct())を使用して、モデルを変更する必要があります(フィールドを延期するため)。


__searchクエリルックアップ

searchルックアップは、MySQLのみをサポートし、機能が非常に制限されているため、非推奨になりました。 カスタムルックアップに置き換えます。

from django.db import models

class Search(models.Lookup):
    lookup_name = 'search'

    def as_mysql(self, compiler, connection):
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)
        params = lhs_params + rhs_params
        return 'MATCH (%s) AGAINST (%s IN BOOLEAN MODE)' % (lhs, rhs), params

models.CharField.register_lookup(Search)
models.TextField.register_lookup(Search)

User.is_authenticated()およびUser.is_anonymous()をメソッドとして使用する

AbstractBaseUser および AnonymousUser クラスのis_authenticated()およびis_anonymous()メソッドがプロパティになりました。 これらはDjango2.0までメソッドとして機能しますが、Djangoでのすべての使用法は属性アクセスを使用するようになりました。

たとえば、 AuthenticationMiddleware を使用していて、ユーザーが現在ログインしているかどうかを知りたい場合は、次を使用します。

if request.user.is_authenticated:
    ... # Do something for logged-in users.
else:
    ... # Do something for anonymous users.

request.user.is_authenticated()の代わりに。

この変更により、メソッドの呼び出しを忘れた場合の偶発的な情報漏えいを回避できます。例:

if request.user.is_authenticated:
    return sensitive_information

カスタムユーザーモデルでこれらのメソッドをオーバーライドする場合は、プロパティまたは属性に変更する必要があります。

DjangoはCallableBoolオブジェクトを使用して、これらの属性がプロパティとメソッドの両方として機能できるようにします。 したがって、非推奨期間が終了するまで、is演算子を使用してこれらのプロパティを比較することはできません。 つまり、以下は機能しません。

if request.user.is_authenticated is True:
    ...

django.utils.safestringの「エスケープ」半分

mark_for_escaping()関数とそれが使用するクラス:EscapeDataEscapeBytesEscapeTextEscapeString、およびEscapeUnicodeは非推奨。

その結果、escapeフィルターの「遅延」動作(フィルターチェーンのどこに表示されていても、常に最後のフィルターとして適用される)は非推奨になります。 フィルタが変更され、Django2.0で conditional_escape()がすぐに適用されます。


その他

  • makemigrations --exitオプションは非推奨になり、makemigrations --checkオプションが優先されます。
  • django.utils.functional.allow_lazy()は非推奨になり、より自然なデコレータ構文で使用できる新しい keep_lazy()関数が採用されました。
  • shell --plainオプションは廃止され、-i pythonまたは--interface pythonが優先されます。
  • django.core.urlresolversモジュールからのインポートは非推奨になり、新しい場所 django.urls が優先されます。
  • テンプレートContext.has_key()メソッドは非推奨になり、inが優先されます。
  • Model._metaのプライベート属性virtual_fieldsは非推奨になり、private_fieldsが優先されます。
  • Field.contribute_to_class()のプライベートキーワード引数virtual_onlyおよびModel._meta.add_field()virtualは非推奨になり、private_onlyおよびprivateが優先されます。それぞれ。
  • javascript_catalog()およびjson_catalog()ビューは非推奨になり、クラスベースのビュー JavaScriptCatalog および JSONCatalog が優先されます。
  • マルチテーブル継承では、OneToOneFieldからparent_linkへの暗黙的な昇格は非推奨です。 そのようなフィールドにparent_link=Trueを追加します。
  • プライベートAPI Widget._format_value()が公開され、 format_value()に名前が変更されました。 古い名前は非推奨期間を経て機能します。
  • プライベートFileFieldメソッドget_directory_name()およびget_filename()は、 Storage.generate_filename()でこの作業を実行するために非推奨になりました。
  • settings.MIDDLEWARE_CLASSESを使用する古いスタイルのミドルウェアは非推奨です。 古いカスタムミドルウェアを適応させ、新しい:setting: `MIDDLEWARE` 設定を使用します。


1.10で削除された機能

これらの機能は非推奨サイクルの終わりに達し、Django1.10で削除されました。 これらの機能の使用を削除する方法など、詳細については、1.8 で非推奨となった機能を参照してください。

  • quote_name_unless_aliasメソッドを呼び出すためのエイリアスとしてSQLCompilerを直接呼び出すためのサポートが削除されました。
  • cycleおよびfirstofテンプレートタグは、futureテンプレートタグライブラリから削除されます。
  • django.conf.urls.patterns()が削除されました。
  • django.conf.urls.i18n.i18n_patterns()に対するprefix引数のサポートが削除されました。
  • SimpleTestCase.urlsが削除されました。
  • forテンプレートタグでアンパックされた値の誤ったカウントを使用すると、サイレントに失敗するのではなく、例外が発生します。
  • ドット付きPythonパスを使用してURLを reverse()する機能が削除されました。
  • LOGIN_URLおよびLOGIN_REDIRECT_URL設定に点線のPythonパスを使用する機能が削除されました。
  • optparseのサポートは、カスタム管理コマンドでは廃止されました。
  • クラスdjango.core.management.NoArgsCommandが削除されました。
  • django.core.context_processorsモジュールが削除されました。
  • django.db.models.sql.aggregatesモジュールが削除されました。
  • django.contrib.gis.db.models.sql.aggregatesモジュールが削除されました。
  • django.db.sql.query.Queryの次のメソッドとプロパティが削除されました。
    • プロパティ:aggregatesおよびaggregate_select
    • 方法:add_aggregateset_aggregate_mask、およびappend_aggregate_mask
  • django.template.resolve_variableが削除されました。
  • 次のプライベートAPIが django.db.models.options.OptionsModel._meta)から削除されました。
    • get_field_by_name()
    • get_all_field_names()
    • get_fields_with_model()
    • get_concrete_fields_with_model()
    • get_m2m_with_model()
    • get_all_related_objects()
    • get_all_related_objects_with_model()
    • get_all_related_many_to_many_objects()
    • get_all_related_m2m_objects_with_model()
  • django.forms.RegexFielderror_message引数が削除されました。
  • unordered_listフィルターは、古いスタイルのリストをサポートしなくなりました。
  • url()への文字列view引数のサポートが削除されました。
  • django.forms.Form._has_changed()の名前をhas_changed()に変更する下位互換性のあるシムが削除されました。
  • removetagsテンプレートフィルターが削除されました。
  • django.utils.htmlremove_tags()およびstrip_entities()機能が削除されました。
  • django.contrib.auth.views.password_reset()is_admin_site引数が削除されました。
  • django.db.models.field.subclassing.SubfieldBaseが削除されました。
  • django.utils.checksumsが削除されました。
  • django.contrib.admin.helpers.InlineAdminFormoriginal_content_type_id属性が削除されました。
  • FormMixin.get_form()form_class引数のデフォルト値なしで定義できるようにする下位互換性シムが削除されました。
  • 次の設定は削除され、:setting: `TEMPLATES` 設定にアップグレードする必要があります。
    • ALLOWED_INCLUDE_ROOTS
    • TEMPLATE_CONTEXT_PROCESSORS
    • TEMPLATE_DEBUG
    • TEMPLATE_DIRS
    • TEMPLATE_LOADERS
    • TEMPLATE_STRING_IF_INVALID
  • 下位互換性エイリアスdjango.template.loader.BaseLoaderが削除されました。
  • get_template()および select_template()によって返されるDjangoテンプレートオブジェクトは、 render()メソッドで Context を受け入れなくなりました。
  • テンプレート応答API は、コンテキストテンプレートの代わりに、dictとバックエンド依存のテンプレートオブジェクトの使用を強制します。
  • 次の関数およびクラスのcurrent_appパラメーターが削除されました。
    • django.shortcuts.render()
    • django.template.Context()
    • django.template.RequestContext()
    • django.template.response.TemplateResponse()
  • 次の関数のdictionaryおよびcontext_instanceパラメーターが削除されました。
    • django.shortcuts.render()
    • django.shortcuts.render_to_response()
    • django.template.loader.render_to_string()
  • 次の関数のdirsパラメーターが削除されました。
    • django.template.loader.get_template()
    • django.template.loader.select_template()
    • django.shortcuts.render()
    • django.shortcuts.render_to_response()
  • 'django.contrib.auth.middleware.SessionAuthenticationMiddleware'MIDDLEWARE_CLASSESにあるかどうかに関係なく、セッション検証が有効になります。 SessionAuthenticationMiddlewareには目的がなくなり、MIDDLEWARE_CLASSESから削除できます。 このメモを読んでいないユーザーへの礼儀として、Django2.0までスタブとして保持されています。
  • プライベート属性django.db.models.Field.relatedが削除されました。
  • migrate管理コマンドの--listオプションが削除されました。
  • ssiテンプレートタグが削除されました。
  • ifテンプレートタグの=比較演算子のサポートが削除されました。
  • max_length引数なしでStorage.get_available_name()およびStorage.save()を定義できるようにする下位互換性シムは削除されました。
  • ModelFormMixin.success_urlのレガシー%(<foo>)s構文のサポートは削除されました。
  • GeoQuerySet集約メソッドcollect()extent()extent3d()make_line()、およびunionagg()が削除されました。
  • コンテンツタイプインスタンスの作成時にContentType.nameを指定する機能が削除されました。
  • allow_migrateの古い署名のサポートは削除されました。
  • コンマ区切りの引数を使用する{% cycle %}の構文のサポートが削除されました。
  • 無効な区切り文字が指定されたときに Signer が発行する警告は、ValueErrorになりました。