本文是 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='中国')
看到
意味着成功创建对象,即成功向数据库插入一条数据。
2)查询数据
同样在 python 终端下,执行下面的命令。
>>> Author.objects.get(name='金庸')
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学习之旅(五)
推荐阅读:
爬虫系列的总结