Django学习之旅(六)

图片来自 unsplash

本文是 Django 学习之旅的完结篇,主要是讲述 model 层。model 层是与数据库打交道的,其中包括 怎么连接数据库、怎么对数据库进行增删改查等。主要逻辑代码是写在 models.py 中。

01 新建数据库

Django 支持的数据库有 PostgreSQL 、MySQL、SQLite等,基本上市面上的有的数据库都支持。我是使用 PyCharm 作为开发工具。PyCharm 在新建项目的时候,会自动生成一个 SQLite 数据库。如果你使用 MySQL 数据库,你需要自行创建数据库。我新建一个名为 Django_demo 的项目,在根目录有个名为 db 的 SQLite 数据库。

02 连接数据库

首先打开 PyCharm 软件,点击 PyCharm 的右侧名为 Database 的选项。这时会弹出操作数据库的可视化界面。点击当前选项卡的左上角的“ + ”号 =》Data source =》选择跟你新建数据库时相同的数据库。我新建数据库是选择 Sqlite ,所以选择 Sqlite 连接。


新建连接会弹出一个对话框。我们需要先安装连接数据库驱动包,再填写数据库访问的地址、数据库帐号密码,最后点击"Test conntection"按钮。如果提示"successful",则证明连接数据库成功。

03 创建字段

在 models.py 文件中,我们新建一个实体类,代码如下:

# Create your models here.
class Author(models.Model):
    name = models.CharField(max_length=50)              # 作家的姓名
    nationality = models.CharField(max_length=50)       # 作家的国籍

class Book(models.Model):
    id = models.AutoField(default=1, primary_key=True)  # 编号
    name = models.CharField(max_length=50)              # 书名
    author = models.ManyToManyField(Author)             # 多对多关系, 作者和书的关系是 n:n
    publish_time = models.DateField()                   # 出版时间

上述代码非常直观。每个模型都用一个类表示,该类继承自 django.db.models.Model。每个模型都有一些类变量,在模型中每个类变量都代表了数据库中的一个字段。

每个字段通过 Field 类的一个实例表示 —— 例如字符字段 CharField 和日期字段 DateTimeField 。这种方法告诉 Django,每个字段中保存着什么类型的数据。更多字段以及含义可以阅读 Django 官方文档。

04 创建表

打开终端,切换目录到 manage.py 所在目录。执行一下两行命令来创建数据库的表。

python manage.py makemigrations
python manage.py migrate

运行成功的结果如下:


在数据库也会发现我们刚才新建的表

05 插入与查询数据

Author 和 Book 表已经新建成功了。你可能有这样的疑惑。我要怎么往该表插入数据呢?听我慢慢道来。
在 Django 中,一个模型类对应一个数据库的表。因此,一个模型类的实例就表示表中的一条数据。为了输出的数据一目了然,我们需要对上面的 model 进行优化。

# Create your models here.
class Author(models.Model):
    name = models.CharField(max_length=50)              # 作家的姓名
    nationality = models.CharField(max_length=50)       # 作家的国籍

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Book(models.Model):
    id = models.AutoField(default=1, primary_key=True)  # 编号
    name = models.CharField(max_length=50)              # 书名
    author = models.ManyToManyField(Author)             # 多对多关系, 作者和书的关系是 n:n
    publish_time = models.DateField()                   # 出版时间

    def __str__(self):              # __unicode__ on Python 2
        return self.name

当我们在 model.py 对这两个模型类修改完成之后,我们需要通知数据库:“我模型已经修改了,你数据库也要更新呀”。
只需要执行上步的两行命令即可

python manage.py makemigrations
python manage.py migrate

Django 会对 models.py 进行检测,自动发现需要更改的,应用到数据库中去。

1)创建对象
打开 python 终端,利用命令行来创建一个对象。

>>> from demo.models import Author
>>> Author.objects.create(name='金庸', nationality='中国')
<Author: Author object>

看到 <Author: Author object> 意味着成功创建对象,即成功向数据库插入一条数据。

2)查询数据
同样在 python 终端下,执行下面的命令。

>>> Author.objects.get(name='金庸')
<Author: Author object>

3)使用 QuerySet API 查询数据
从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet。而一旦我们建立好数据模型,Django 会自动为我们生成一套数据库抽象的API。这样就大大方便我们创建、检索、更新和删除对象。
假如现在有个需求,我们需要查询数据库中所有的作者并打印出作者的姓名。我们可以利用 QuerySet 支持迭代的特性来进行操作。

authors = Author.objects.all()
for a in authors :
    print(a.name)

QuerySet 还有更加复杂的用法, 利用过滤条件来筛选出数据。

// get 是用来获取一个对象的,如果需要获取满足条件的数据集,就要用到filter
Author.objects.filter(name='金庸')   # 名称严格等于'金庸'的作家      
Author.objects.filter(name_contains='金庸') # 名称中包含'金庸'字眼的作家
......
还有很多用法,大家可以去看下官网的文档

4)使用 QuerySet 创建数据
我们之前创建对象都是通过命令行。但是在生产环境中,显然不能这么操作。那么我们要如何在 py 文件中创建对象呢? QuerySet 创建对象一共有四种办法

方法 A

Author.objects.create(name='金庸', nationality='中国')

方法B

author = Author(name='金庸', nationality='中国')
author.save()

方法C

author = Author()
author.name='金庸' 
author.nationality='中国'
author.save()

方法D

# 首先尝试获取,不存在就创建,可以防止重复
Author.objects.get_or_create(name='金庸', nationality='中国')
# 返回值(object, True/False)

5)使用 QuerySet 更新数据
A、单个 object 更新, 适合于 .get(), get_or_create(), update_or_create() 等得到的 obj,和新建很类似。

author = Author.objects.get(name='金庸')
author.name='古龙'
author.enationality='中国'
author.save()  # 最后一定不要忘记保存!!!

B、批量更新, 适用于 .all() .filter() .exclude() 等后面

Author.objects.filter(name__contains="金").update('古') # 名称中包含 "金"的人 都改成古
Author.objects.all().delete() # 删除所有 Author 记录

6)使用 QuerySet 删除数据
删除的用法跟创建用法是大同小异,在获取结果后面添加 delete() 方法即可。

Author.objects.filter(name__contains="金").delete() # 删除 名称中包含 "金"的作家

Django 学习之旅不知不觉到了终点了。终点又是另一个新的起点。我们虽然对 Django 已经有大概的认识,仅仅了解些皮毛,但是还需要深入学习,掌握其精髓。后续我会学习然后分享 Django 一些精髓用法。


系列文章:
Django学习之旅(一)
Django学习之旅(二)
Django学习之旅(三)
Django学习之旅(四)
Django学习之旅(五)
推荐阅读:
爬虫系列的总结


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容