Django updgrading to 1.7

昨天去 Django 官网上面看文档,发现 1.7 已经妥妥滴发布了(此前估计是程序已经定版 release,但是文档各方面还没有完成),然后看了一下 release note,感觉相当有动力曲江现有的 1.6 版本提升到 1.7 了。

现在这里发一个 Release note 的链接,否则不好找,可供快速参照:

https://docs.djangoproject.com/en/1.7/releases/

另外由于按照 python 生态的传统,每个大版本号里面是基本向上兼容的,也就是说新的 1.7 版本 django 按理来说应该兼容 1.6 版本的 django 程序,于是我就放心升级了。

下面归纳一下 1.6 到 1.7 的变化,主要有如下几点,以下按照对我的影响程度归纳一下:

1. 增加了模型层的 migrate 功能:RELEASE NOTE

这点不可谓不伟大!因为在以往的 django 当中,模型架构的更新只能够进行新增,如果已经在数据库建表的模型,是不能够进行更改的。

也就是说,如果有一个模型增加了一个字段或者修改了字段的类型,那么按照旧版的

python manage.py syncdb

就将会不对该模型起作用,文档里面也是介绍,如果要改,只好在数据库里面将变动的模型更新手动做上去,这多么恶心啊,想着都麻烦死了。

还好,在旧版本有 South 库,可以做 migration,自动去完成变动模型所需的工作。

不过,现在有了 1.7,这直接就把 South 给退休了!

原版的 syncdb 指令将不起作用,如果要同步模型,需要使用

python manage.py migrate

来进行迁移。

后来,我发现原本在自己的 app 里面的模型实质上没有发生变化,就在 stackoverflow 上面找了一下【问题链接】,原来对于自定义的 app 里面需要手动将其添加到 migration 里面,通过以下的命令:

python manage.py makemigrations your_app_label

搞起来之后,真不是一般的爽~~

2. 在 models.py 之外定义的 model 不需要显式指定 app_label RELEASE NOTE

由于我实际操作的时候,将 app 里面的 models.py 扩展成了一个 python 包(这样可以将大量的代码进行分拆,避免一个单独的文件过长。)

但是在 1.6 之前的版本,这样就必须在 Meta Class 里面加入 app_label 属性,以显式指定当前的 app,否则 syncdb 的时候会失效。

现在这个显式指定 app_label 也不需要了,立马把模型里面的 app_label 设置去掉,代码精简了不少。

3. VIEW 层的 render 快捷方式函数兼容性变了

具体可以看我自己发的这个 stackoverflow 问题

酱紫,看这个问题

出于一种为了在所有的 template 里面建立一个公共上下文(context)的需要,我们需要用到一个叫做自定义的上下文预处理器(context pre-processor)的东西,来往 request 里面加点东西。

然后在 view 里面返回一个模板的渲染(我以前)一般是这样写的:

# 001
def my_view(request):
    context = {...}
    render(request, 'template_xxx.html', RequestContext(request, context))

当然,麻烦一点的旧版写法其实是这样写的:

# 002
def my_view(request):
    context = {...}
    render_to_response('template_xxx.html', context, RequestContext(request))

一般不考虑自定义上下文预处理器的时候,我们是不需要用到 request 也不需要用到 RequestContext 的,就如:

# 003
def my_view(request):
    context = {...}
    render_to_response('template_xxx.html', context)

使用 RequestContext 将 request 和 context 包装一下的用途就是把 pre-processor 产生的上下文代进去。

说了这么多,其实就是 #001 的写法不支持了,实际上可以看到 request 这个参数传进去是重复了,其实在 1.6 里面的文档标准也不是这样写的,只是可以这么写。实际上在 1.7 里面应该写成下面这个模样:

# 004 正解
def my_view(request):
    context = {...}
    render(request, 'template_xxx.html', context)

这样写才不会报错,效果与以上的都相同。


其他当然好有很多新的功能,但是感觉暂时没用到,以后再慢慢深入研究。


【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2014/09/django-1-7-upgrade.html【Django updgrading to 1.7】

《Django updgrading to 1.7》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注