Django 2.0版本的新特性抢先看!


Posted in Python onJanuary 05, 2018

前言

2017年12月2日,Django官方发布了2.0版本,成为多年来的第一次大版本提升,那么2.0对广大Django使用者有哪些变化和需要注意的地方呢?

一、Python兼容性

Django 2.0支持Python3.4、3.5和3.6。Django官方强烈推荐每个系列的最新版本。

最重要的是Django 2.0不再支持Python2!

Django 1.11.x是支持Python2.7的最后版本。

二、2.0新特性

1.简化了URL路由语法

django.urls.path()方法的语法更简单了。

例如以前的:

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

可以写作:

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

新语法支持强制定义参数类型。例子中只接收整数型年份参数,不再接收字符串类型,同时“10000”年也是合法的(虽然是5位数字),而不像先前正则里只能接收4位数字。

以前版本的django.conf.urls.url()方法变成了django.urls.re_path() ,但为了向后兼容,旧的依然保留,而不是立刻废弃。django.conf.urls.include()方法现在可以从django.urls导入,也就是你可以使用from django.urls import include, path, re_path

2.admin后台对移动端更加友好

Django最受大家欢迎的admin后台,具有响应式特性,支持主流的移动设备。

3.Window 表达式

新的Window表达式允许为查询集添加一个OVER从句。

4.小特性

django.contrib.admin后台

新的ModelAdmin.autocomplete_fields属性和ModelAdmin.get_autocomplete_fields()方法现在可以在外键和多对多字段上使用Select2搜索框。

django.contrib.auth用户认证

PBKDF2密码哈希默认的迭代次数从36000增加到100000。

django.contrib.gis地理框架

  • 为AsGeoJSON、GeoHash和GeoHash方法,isvalid和distance查询增加MySQL支持;
  • 添加Azimuth和LineLocatePoint方法,支持PostGIS和SpatiaLite;
  • 所有从GeoJSON导入的GEOSGeometry拥有SRID集合;
  • 添加OSMWidget.default_zoom属性,用于自定义地图的默认缩放级别;
  • metadata现在是可读可编辑的;
  • 允许在GDAL的内部虚拟文件系统中创建GDALRaster对象;
  • 新的GDALBand.color_interp()方法返回波段的颜色说明。

django.contrib.postgres数据库

  • ArrayAgg新增distinct参数;
  • 新的RandomUUID函数;
  • django.contrib.postgres.indexes.GinIndex现在支持fastupdate和gin_pending_list_limit参数;
  • 新的GistIndex类允许在数据库中创建GiST索引;
  • inspectdb现在可以内省JSONField和RangeFields。

django.contrib.sitemaps站点地图

  • 为GenericSitemap构造器增加protocol参数;

Cache缓存

  • cache.set_many()现在返回一个列表,包含了插入失败的键值;

File Storage文件存储

  • File.open()现在可以用于上下文管理器,例如with file.open() as f:

Forms表单

  • SplitDateTimeWidget和SplitHiddenDateTimeWidget增加date_attrs与time_attrs参数,用于为DateInput与TimeInput指定HTML属性;
  • 新的Form.errors.get_json_data()方法返回字典类型的表单错误,以适应JSON类型x响应;

Generic Views通用视图

  • 新的ContextMixin.extra_context属性允许在View.as_view()中添加上下文;

Management Commands管理命令

  • inspectdb现在将MySQL的无符号整数视作PositiveIntegerField或者PositiveSmallIntegerField;
  • 新增makemessages --add-location选项;
  • loaddata现在可以从标准输入读入;
  • 新增diffsettings --output选项;

Migrations迁移

  • 新增squashmigrations --squashed-name选项;

Models模型

  • 新增StrIndex数据库函数;
  • 对于Oracle数据库,AutoField和BigAutoField现在会生成identity列;
  • QuerySet.iterator()新增chunk_size参数;
  • QuerySet.earliest() QuerySet.latest()Meta.get_latest_by现在可以根据一些字段进行排序;
  • 增加ExtractQuarter方法,用于DateField和DateTimeField;
  • 新增TruncQuarter方法用于截取DateField和DateTimeField到季度的第一天;
  • 为基于类的索引添加db_tablespace参数;
  • QuerySet.select_for_update()增加of参数,但只支持PostgreSQL和Oracle数据库;
  • QuerySet.in_bulk()新增field_name参数;
  • CursorWrapper.callproc()现在接收可选的字典类型关键字参数;
  • QuerySet.values_list()新增named参数,用于获取命名的元组结果;
  • 新的FilteredRelation类允许为查询集增加一个ON从句;

Pagination分页

  • 增加Paginator.get_page() ,可以处理各种非法页面参数,防止异常;

Requests and Responses请求和响应

  • 现在,runserver服务器支持HTTP 1.1;

Templates模版

  • 为了提高Engine.get_default()在第三方模块的用途,现在它将返回配置在TEMPLATES中的多个DjangoTemplates引擎中的第一个,而不是弹出ImproperlyConfigured错误;
  • 自定义模版标签现在接收强制关键字参数;

Tests测试

  • 为LiveServerTestCase添加多线程支持;

Validators验证器

新的ProhibitNullCharactersValidator不允许CharField及其子类的表单输入为空;

三、重要的向后不兼容

1. 某些地方删除对bytestrings的支持

例如,对于reverse() ,现在使用str()代替force_text()

2. AbstractUser.last_name的最大长度增加到150

如果你有一个自定义的用户模型继承了AbstractUser,你需要生成并应用一个数据库迁移,使得last_name的最大长度变为150。

如果你需要为last_name保持30个字符的限制,可以如下使用自定义表单:

from django.contrib.auth.forms import UserChangeForm
class MyUserChangeForm(UserChangeForm):
 last_name = forms.CharField(max_length=30, required=False)

如果你需要在admin中也保持这个约束,那么可以如下使用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()不能用于切片后的查询集

对切片后的查询集使用反转和获取最近对象的操作将弹出异常,如下所示:

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

4. 表单的字段不再接收可选参数作为位置参数

为了防止运行时错误,提高可靠性。以前类似下面的参数传递方法,现在是错误的了:

forms.IntegerField(25, 10)

要这么传递:

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

5. Index不再接收位置参数

例如下面的用法将导致异常:

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

要提供参数关键字,改写为:

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

6. call_command()将验证它接收的选项

对于使用选项而不是使用parser.add_argument()进行自定义的管理命令,需要添加一个stealth_options属性,如下所示:

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

7. SQLite现在支持外键约束

另外,Django2.0还废弃和移除了一些方法和属性。

总结

好像也没多大变化,不是重度使用者,基本感受不出变化来,该怎么用还是怎么用,^-^!

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python中enumerate的用法实例解析
Aug 18 Python
用Python从零实现贝叶斯分类器的机器学习的教程
Mar 31 Python
简单介绍利用TK在Python下进行GUI编程的教程
Apr 13 Python
Python入门之三角函数atan2()函数详解
Nov 08 Python
python实现三维拟合的方法
Dec 29 Python
python 监听salt job状态,并任务数据推送到redis中的方法
Jan 14 Python
PyQt5重写QComboBox的鼠标点击事件方法
Jun 25 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
Sep 28 Python
Pandas DataFrame中的tuple元素遍历的实现
Oct 23 Python
将python安装信息加入注册表的示例
Nov 20 Python
python实现扫雷游戏
Mar 03 Python
Python中for后接else的语法使用
May 18 Python
微信跳一跳游戏python脚本
Apr 01 #Python
Python基于列表list实现的CRUD操作功能示例
Jan 05 #Python
django 2.0更新的10条注意事项总结
Jan 05 #Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
Jan 05 #Python
python with提前退出遇到的坑与解决方案
Jan 05 #Python
微信跳一跳小游戏python脚本
Jan 05 #Python
Python通过OpenCV的findContours获取轮廓并切割实例
Jan 05 #Python
You might like
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
第七节--类的静态成员
2006/11/16 PHP
php5.2时间相差8小时
2007/01/15 PHP
php数组去重复数据示例
2014/02/25 PHP
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
2010/11/16 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战二)
2013/08/21 Javascript
用jquery写的一个万年历(自写)
2014/01/20 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
Javascript中判断对象是否为空
2015/06/10 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
ES6 javascript的异步操作实例详解
2017/10/30 Javascript
vue如何搭建多页面多系统应用
2020/06/17 Javascript
Python实现删除当前目录下除当前脚本以外的文件和文件夹实例
2015/07/27 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
Python使用re模块正则提取字符串中括号内的内容示例
2018/06/01 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
Python测试Kafka集群(pykafka)实例
2019/12/23 Python
pytorch之inception_v3的实现案例
2020/01/06 Python
python单例设计模式实现解析
2020/01/07 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
2020/11/02 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
关于css兼容性问题及一些常见问题汇总
2016/05/03 HTML / CSS
瑞典最好的运动鞋专卖店:Sneakersnstuff
2016/08/29 全球购物
会计电算化应届生求职信
2013/11/03 职场文书
学习新党章思想汇报
2014/01/09 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书
机关中层领导干部群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
实训报告范文大全
2014/11/04 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
2019最新激励员工口号大全!
2019/06/28 职场文书
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
大型强子对撞机再次重启探索“第五种自然力”
2022/04/29 数码科技
基于Python实现nc批量转tif格式
2022/08/14 Python