Django 2.0版本的新特性搶先看!
前言
2017年12月2日,Django官方發(fā)布了2.0版本,成為多年來的第一次大版本提升,那么2.0對(duì)廣大Django使用者有哪些變化和需要注意的地方呢?
一、Python兼容性
Django 2.0支持Python3.4、3.5和3.6。Django官方強(qiáng)烈推薦每個(gè)系列的最新版本。
最重要的是Django 2.0不再支持Python2!
Django 1.11.x是支持Python2.7的最后版本。
二、2.0新特性
1.簡(jiǎn)化了URL路由語(yǔ)法
django.urls.path()
方法的語(yǔ)法更簡(jiǎn)單了。
例如以前的:
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
可以寫作:
path('articles/<int:year>/', views.year_archive),
新語(yǔ)法支持強(qiáng)制定義參數(shù)類型。例子中只接收整數(shù)型年份參數(shù),不再接收字符串類型,同時(shí)“10000”年也是合法的(雖然是5位數(shù)字),而不像先前正則里只能接收4位數(shù)字。
以前版本的django.conf.urls.url()
方法變成了django.urls.re_path()
,但為了向后兼容,舊的依然保留,而不是立刻廢棄。django.conf.urls.include()
方法現(xiàn)在可以從django.urls
導(dǎo)入,也就是你可以使用from django.urls import include, path, re_path
。
2.admin后臺(tái)對(duì)移動(dòng)端更加友好
Django最受大家歡迎的admin后臺(tái),具有響應(yīng)式特性,支持主流的移動(dòng)設(shè)備。
3.Window 表達(dá)式
新的Window表達(dá)式允許為查詢集添加一個(gè)OVER從句。
4.小特性
django.contrib.admin后臺(tái)
新的ModelAdmin.autocomplete_fields
屬性和ModelAdmin.get_autocomplete_fields()
方法現(xiàn)在可以在外鍵和多對(duì)多字段上使用Select2搜索框。
django.contrib.auth用戶認(rèn)證
PBKDF2密碼哈希默認(rèn)的迭代次數(shù)從36000增加到100000。
django.contrib.gis地理框架
- 為AsGeoJSON、GeoHash和GeoHash方法,isvalid和distance查詢?cè)黾覯ySQL支持;
- 添加Azimuth和LineLocatePoint方法,支持PostGIS和SpatiaLite;
- 所有從GeoJSON導(dǎo)入的GEOSGeometry擁有SRID集合;
- 添加OSMWidget.default_zoom屬性,用于自定義地圖的默認(rèn)縮放級(jí)別;
- metadata現(xiàn)在是可讀可編輯的;
- 允許在GDAL的內(nèi)部虛擬文件系統(tǒng)中創(chuàng)建GDALRaster對(duì)象;
- 新的
GDALBand.color_interp()
方法返回波段的顏色說明。
django.contrib.postgres數(shù)據(jù)庫(kù)
- ArrayAgg新增distinct參數(shù);
- 新的RandomUUID函數(shù);
django.contrib.postgres.indexes.GinIndex
現(xiàn)在支持fastupdate和gin_pending_list_limit參數(shù);- 新的GistIndex類允許在數(shù)據(jù)庫(kù)中創(chuàng)建GiST索引;
- inspectdb現(xiàn)在可以內(nèi)省JSONField和RangeFields。
django.contrib.sitemaps站點(diǎn)地圖
- 為GenericSitemap構(gòu)造器增加protocol參數(shù);
Cache緩存
cache.set_many()
現(xiàn)在返回一個(gè)列表,包含了插入失敗的鍵值;
File Storage文件存儲(chǔ)
File.open()
現(xiàn)在可以用于上下文管理器,例如with file.open() as f:
;
Forms表單
- SplitDateTimeWidget和SplitHiddenDateTimeWidget增加date_attrs與time_attrs參數(shù),用于為DateInput與TimeInput指定HTML屬性;
- 新的
Form.errors.get_json_data()
方法返回字典類型的表單錯(cuò)誤,以適應(yīng)JSON類型x響應(yīng);
Generic Views通用視圖
- 新的
ContextMixin.extra_context
屬性允許在View.as_view()
中添加上下文;
Management Commands管理命令
- inspectdb現(xiàn)在將MySQL的無符號(hào)整數(shù)視作PositiveIntegerField或者PositiveSmallIntegerField;
- 新增makemessages --add-location選項(xiàng);
- loaddata現(xiàn)在可以從標(biāo)準(zhǔn)輸入讀入;
- 新增diffsettings --output選項(xiàng);
Migrations遷移
- 新增squashmigrations --squashed-name選項(xiàng);
Models模型
- 新增StrIndex數(shù)據(jù)庫(kù)函數(shù);
- 對(duì)于Oracle數(shù)據(jù)庫(kù),AutoField和BigAutoField現(xiàn)在會(huì)生成identity列;
QuerySet.iterator()
新增chunk_size參數(shù);QuerySet.earliest()
、QuerySet.latest()
和Meta.get_latest_by
現(xiàn)在可以根據(jù)一些字段進(jìn)行排序;- 增加ExtractQuarter方法,用于DateField和DateTimeField;
- 新增TruncQuarter方法用于截取DateField和DateTimeField到季度的第一天;
- 為基于類的索引添加db_tablespace參數(shù);
- 為
QuerySet.select_for_update()
增加of參數(shù),但只支持PostgreSQL和Oracle數(shù)據(jù)庫(kù); QuerySet.in_bulk()
新增field_name參數(shù);CursorWrapper.callproc()
現(xiàn)在接收可選的字典類型關(guān)鍵字參數(shù);QuerySet.values_list()
新增named參數(shù),用于獲取命名的元組結(jié)果;- 新的FilteredRelation類允許為查詢集增加一個(gè)ON從句;
Pagination分頁(yè)
- 增加
Paginator.get_page()
,可以處理各種非法頁(yè)面參數(shù),防止異常;
Requests and Responses請(qǐng)求和響應(yīng)
- 現(xiàn)在,runserver服務(wù)器支持HTTP 1.1;
Templates模版
- 為了提高
Engine.get_default()
在第三方模塊的用途,現(xiàn)在它將返回配置在TEMPLATES中的多個(gè)DjangoTemplates引擎中的第一個(gè),而不是彈出ImproperlyConfigured錯(cuò)誤; - 自定義模版標(biāo)簽現(xiàn)在接收強(qiáng)制關(guān)鍵字參數(shù);
Tests測(cè)試
- 為L(zhǎng)iveServerTestCase添加多線程支持;
Validators驗(yàn)證器
新的ProhibitNullCharactersValidator不允許CharField及其子類的表單輸入為空;
三、重要的向后不兼容
1. 某些地方刪除對(duì)bytestrings的支持
例如,對(duì)于reverse()
,現(xiàn)在使用str()
代替force_text()
。
2. AbstractUser.last_name的最大長(zhǎng)度增加到150
如果你有一個(gè)自定義的用戶模型繼承了AbstractUser,你需要生成并應(yīng)用一個(gè)數(shù)據(jù)庫(kù)遷移,使得last_name的最大長(zhǎng)度變?yōu)?50。
如果你需要為last_name保持30個(gè)字符的限制,可以如下使用自定義表單:
from django.contrib.auth.forms import UserChangeForm class MyUserChangeForm(UserChangeForm): last_name = forms.CharField(max_length=30, required=False)
如果你需要在admin中也保持這個(gè)約束,那么可以如下使用UserAdmin.form:
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)
3. QuerySet.reverse()和last()不能用于切片后的查詢集
對(duì)切片后的查詢集使用反轉(zhuǎn)和獲取最近對(duì)象的操作將彈出異常,如下所示:
>>> Model.objects.all()[:2].reverse() Traceback (most recent call last): ... TypeError: Cannot reverse a query once a slice has been taken.
4. 表單的字段不再接收可選參數(shù)作為位置參數(shù)
為了防止運(yùn)行時(shí)錯(cuò)誤,提高可靠性。以前類似下面的參數(shù)傳遞方法,現(xiàn)在是錯(cuò)誤的了:
forms.IntegerField(25, 10)
要這么傳遞:
forms.IntegerField(max_value=25, min_value=10)
5. Index不再接收位置參數(shù)
例如下面的用法將導(dǎo)致異常:
models.Index(['headline', '-pub_date'], 'index_name')
要提供參數(shù)關(guān)鍵字,改寫為:
models.Index(fields=['headline', '-pub_date'], name='index_name')
6. call_command()將驗(yàn)證它接收的選項(xiàng)
對(duì)于使用選項(xiàng)而不是使用parser.add_argument()
進(jìn)行自定義的管理命令,需要添加一個(gè)stealth_options屬性,如下所示:
class MyCommand(BaseCommand): stealth_options = ('option_name', ...)
7. SQLite現(xiàn)在支持外鍵約束
另外,Django2.0還廢棄和移除了一些方法和屬性。
總結(jié)
好像也沒多大變化,不是重度使用者,基本感受不出變化來,該怎么用還是怎么用,^-^!
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
pandas read_excel()和to_excel()函數(shù)解析
這篇文章主要介紹了pandas read_excel()和to_excel()函數(shù)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09pyecharts繪制時(shí)間輪播圖柱形圖+餅圖+玫瑰圖+折線圖
這篇文章主要介紹了pyecharts繪制時(shí)間輪播圖柱形圖+餅圖+玫瑰圖+折線圖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-06-06python?logging多進(jìn)程多線程輸出到同一個(gè)日志文件的實(shí)戰(zhàn)案例
這篇文章主要介紹了python?logging多進(jìn)程多線程輸出到同一個(gè)日志文件的實(shí)戰(zhàn)案例,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02用Python簡(jiǎn)單實(shí)現(xiàn)Http服務(wù)端
這篇文章主要為大家介紹了使用Python簡(jiǎn)單實(shí)現(xiàn)Http服務(wù)端示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Python字符串和正則表達(dá)式中的反斜杠(''\'')問題詳解
在本篇文章里小編給大家整理的是關(guān)于Python字符串和正則表達(dá)式中的反斜杠('\')問題以及相關(guān)知識(shí)點(diǎn),有需要的朋友們可以學(xué)習(xí)下。2019-09-09Python 執(zhí)行矩陣與線性代數(shù)運(yùn)算
這篇文章主要介紹了Python 執(zhí)行矩陣與線性代數(shù)運(yùn)算,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-08-08scrapy數(shù)據(jù)存儲(chǔ)在mysql數(shù)據(jù)庫(kù)的兩種方式(同步和異步)
這篇文章主要介紹了scrapy數(shù)據(jù)存儲(chǔ)在mysql數(shù)據(jù)庫(kù)的兩種方式(同步和異步),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02