3.0中向后不兼容的更改
數據庫后端API
本節描述了第三方數據庫后端中可能需要的更改。
- 現在的第二個參數
DatabaseIntrospection.get_geometry_type()是行描述,而不是列名。 DatabaseIntrospection.get_field_type()可能不再返回元組。- 如果數據庫可以在添加字段的同一SQL語句中創建外鍵,請添加
SchemaEditor.sql_create_column_inline_fk適當的SQL;否則,請添加相應的SQL。否則,設置。DatabaseFeatures.can_create_inline_fk = False DatabaseFeatures.can_return_id_from_insert並且can_return_ids_from_bulk_insert被重命名為can_return_columns_from_insert和can_return_rows_from_bulk_insert。- 現在,數據庫函數可以處理
datetime.timezone使用datetime.timedelta實例創建的格式(例如timezone(timedelta(hours=5))輸出'UTC+05:00')。DateTimeField在,等中進行准備時datetime_cast_date_sql(), 第三方后端應處理此格式datetime_extract_sql()。 - 條目
AutoField,BigAutoField和SmallAutoField被添加到DatabaseOperations.integer_field_ranges支持關於這些字段類型的整數范圍的驗證。第三方后端可能需要自定義默認條目。 DatabaseOperations.fetch_returned_insert_id()替換為,fetch_returned_insert_columns()它返回語句返回的值列表,而不是單個值。INSERT … RETURNINGDatabaseOperations.return_insert_id()替換為return_insert_columns()接受fields參數的參數,該參數是插入后要返回的字段的可迭代項。通常,這只是自動生成的主鍵。
django.contrib.admin
- 管理員的模型歷史記錄更改消息現在傾向於使用更具可讀性的字段標簽,而不是字段名稱。
django.contrib.gis
- 不再支持PostGIS 2.1。
- 刪除了對SpatiaLite 4.1和4.2的支持。
- 刪除了對GDAL 1.11和GEOS 3.4的支持。
不再支持PostgreSQL 9.4
對PostgreSQL 9.4的上游支持將於2019年12月結束。Django3.0支持PostgreSQL 9.5和更高版本。
不再支持Oracle 12.1
對Oracle 12.1的上游支持將於2021年7月結束。Django2.2將一直支持到2022年4月。Django3.0正式支持Oracle 12.2和18c。
刪除了專用的Python 2兼容性API
盡管在Django 2.0中刪除了對Python 2的支持,但並未從Django中刪除某些私有API,因此第三方應用程序可以繼續使用它們,直到Python 2終止使用為止。
由於我們希望應用在添加對Django 3.0的支持時會降低Python 2的兼容性,因此我們目前正在刪除這些API。
django.test.utils.str_prefix()-Python 3中的字符串沒有'u'前綴。django.test.utils.patch_logger()-unittest.TestCase.assertLogs()改用。django.utils.lru_cache.lru_cache()-的別名functools.lru_cache()。django.utils.decorators.available_attrs()-此函數返回functools.WRAPPER_ASSIGNMENTS。django.utils.decorators.ContextDecorator-的別名contextlib.ContextDecorator。django.utils._os.abspathu()-的別名os.path.abspath()。django.utils._os.upath()和npath()-這些功能在Python 3上不起作用。django.utils.six-刪除此供應商庫的使用或切換到 六個。django.utils.encoding.python_2_unicode_compatible()-的別名six.python_2_unicode_compatible()。django.utils.functional.curry()-使用functools.partial()或functools.partialmethod。參見5b1c389603a353625ae1603。django.utils.safestring.SafeBytes-自Django 2.0起未使用。
對於新的默認值FILE_UPLOAD_PERMISSIONS設置
在舊版本中,該FILE_UPLOAD_PERMISSIONS設置默認為 None。使用默認值FILE_UPLOAD_HANDLERS,這會導致上載的文件具有不同的權限,具體取決於它們的大小和使用的上載處理程序。
FILE_UPLOAD_PERMISSION現在默認為0o644避免這種不一致。
安全設置新的默認值
為了使Django項目默認更安全,某些安全設置現在具有更安全的默認值:
X_FRAME_OPTIONS現在默認為'DENY'。SECURE_CONTENT_TYPE_NOSNIFF現在默認為True。
有關這些更改的更多詳細信息,請參見上面的“新增 安全性”部分。
雜項
ContentType.__str__()現在包含了該模型app_label,可在不同應用中消除同名模型的歧義。- 因為不贊成在會話中而不是在cookie中訪問語言,所以注銷后不再在會話中
LocaleMiddleware查找用戶的語言,django.contrib.auth.logout()也不再保留會話的語言。 django.utils.html.escape()現在用於html.escape()轉義HTML。這將轉換'為'而不是先前的等效十進制代碼'。- 該選項現在工作作為選項,而不是作為一個快捷方式。
django-admin test -kunittest -k--keepdb pywatchman<1.2.0的支持已刪除。urlencode()現在可以對whener進行編碼doseq=False,而不是對其進行迭代,從而使其與標准庫urllib.parse.urlencode()函數保持一致。intword模板過濾器現在轉換1.0為單數短語,所有其他數值轉換為復數形式。對於某些語言,這可能是不正確的。- 現在,將值分配給模型的
ForeignKey或 屬性會取消設置相應的字段。之后訪問該字段將導致查詢。OneToOneField'_id' patch_vary_headers()現在'*'根據RFC 7231#section-7.1.4,即,如果標頭字段名稱列表包含星號,則Vary標頭將由單個星號組成'*'。- 在MySQL 8.0.16+,
PositiveIntegerField而PositiveSmallIntegerField現在包括檢查約束,以防止數據庫中的負值。 alias=None已添加到的簽名Expression.get_group_by_cols()。sqlparse<0.2.2的支持已刪除。
