Django的教程写到这里,就进入了整体的第二部分,也是最关键的部分。此时有一个问题必须想清楚,那就是,以项目带动内容还是以参考书目的方式展开?为此,我考虑了很久。
    我在开始学习Django的时候,也看过许多教程和博客,有的专述某个细节,虽然比较深入,但不够全面;有的比较泛泛但不够深入。有的以项目带动,简单易懂,可以跟着一步步做,但做完了,只学到作者的几个小技巧,对Django仍然是一知半解。都知道用Django的ORM可以方便的操作数据库,但你知道Django有几种数据库API么?都知道模板过滤器很有帮助,但你都用过么,是不是只会大小写转换?
    项目实战当然重要,但是全面完善的内容介绍能给你更多的帮助。参考书式的讲解,可能比较晦涩,但绝对是你入门之后,最好的帮手,我们可以时不时,在需要的情况下,回头再翻翻,然后恍然大悟,原来Django本身就有这个功能,根本不需要自己实现。毕竟我们学习Django不是学习如何开发Web框架,而是学习Web框架本身提供给你的功能,如果连Django提供的现成功能都不能够了解齐全,还谈什么二次开发?
    当然,项目实战也必须有,但这就是教程的第三部分内容了。
    基调已定,那么为了保证内容的全面、准确和权威性,本部分内容以Django官方文档为依据,加以适当调整和修饰。
    以上!!


    回到我们的主题—模型层。
    在MVC或者说MTV设计模式中,模型(M)代表对数据库的操作。那么如何操作数据库呢?
    手动切换到数据库环境,然后敲入SQL语句?你知道这是个笑话!
    我们是程序员,讲的是自动化,实现的是Python环境下的操作,所以我们必然是通过写Python代码的方式。可是….Python和数据库语言SQL是两码事啊,它根本操作不了数据库!没关系,我们可以在Python代码中嵌入SQL语句,比如下面的方式:

    1. # 创建连接,这里先忽略创建方法
    2. conn = ......
    3. # 创建游标
    4. cursor = conn.cursor()
    5. # 执行SQL,并返回收影响行数
    6. effect_row = cursor.execute("insert into host (hostname,port,ip) values('ubuntu','22','10.0.0.2');")
    7. # 提交,不然无法保存新建或者修改的数据
    8. conn.commit()
    9. # 关闭游标
    10. cursor.close()
    11. # 关闭连接
    12. conn.close()

    但是问题又来了,Python怎么创建和数据库的连接呢?或者更直白的说Python怎么连接数据库呢?可以使用类似pymysql这一类的第三方模块(针对不同的数据库,有不同的模块)。于是我们可以进行如下的连接:
    conn = pymysql.connect(host=’137.78.5.130’, port=3306, user=’root’, passwd=’123456’, db=’test’)

    提示:对于低版本的Django,推荐使用pymysql库。但对于2.2之后的Django,推荐使用mysqlclient库。

    好了,这样似乎就Ok了。但是,如果你有很多的数据库操作,并且你的Python程序员不是专业的DBA,写的SQL语句很烂,甚至经常写错,怎么办?
    聪明的人想出了一个办法:用Python语法来写,然后使用一个中间工具将Python代码翻译成原生的SQL语句,这样你总不会写错了吧?这个中间工具就是所谓的ORM(对象关系映射)!
    ORM将一个Python的对象映射为数据库中的一张关系表。它将SQL封装起来,程序员不再需要关心数据库的具体操作,只需要专注于自己本身代码和业务逻辑的实现。
    于是,整体的实现过程就是:Python代码,通过ORM转换成SQL语句,再通过pymysql去实际操作数据库。
    第一章:模型层 - 图1

    最典型的ORM就是SQLAlchemy了,如果你的Web框架自身不带ORM系统,那么你可以安装使用它,SQLAlchemy使用者还是比较多的,本身功能也比较强大,大家可以自行学习。

    第一章:模型层 - 图2


    Django自带ORM系统,不需要额外安装别的ORM。当然,也可以安装并使用其它的ORM,比如SQLAlchemy,但是不建议这么做,因为Django系统庞大,集成完善,模型层与视图层、模板层结合得比较紧密,使用自带的ORM更方便更可靠,并且Django自带的ORM功能也非常强大,也不难学。
    Django的ORM系统体现在框架内就是模型层。想要理解模型层的概念,关键在于理解用Python代码的方式来定义数据库表的做法!一个Python的类,就是一个模型,代表数据库中的一张数据表!Django奉行Python优先的原则,一切基于Python代码的交流,完全封装SQL内部细节。