1.Django 的 ORM 介绍
对象关系映射(英语:(Object Relational Mapping, 简称 ORM, 或 O/RM, 或 O/R mapping), 是一种程序技术, 用于实现面向对象编程语言里不同类型系统的数据之间的转换. 从效果上说, 它其实是创建了一个可在编程语言里使用的 "虚拟对象数据库".
对象关系映射就是通过面向对象的方式操纵数据库, 达到不用编写 SQL 语句就能实现对数据库的增删改查. 只需要通过 python 的面向对象的方式就能够清楚数据之间的关系.
python 是一个编程语言, 一个软件, MySQL 是数据库管理系统, 也是一个软件, python 安装 pymysql 库后, 通过编写 SQL 语句对 MySQL 进行增删改查等操作, 这需要对 SQL 语句非常了解. 在数据库中, 数据之间的关系通过表来展现. 在编程语言中有一种面向对象的编程方式, 对数据关系进行封装后描述事物之间的关系.
其映射关系为:
? 1). 模型类必须都写在 App 下的 models.py 文件中
? 2). 模型如果需要映射到数据库, 所在的 App 必须被安装.
? 3). 一个数据表对应一个模型类; 表中的字段对应模型中的类属性; 模型的一个实例对应表中的一条数据 **
2.Django 连接 MySQL 的配置流程
启动服务后, 会生成一个 db.sqlite3 文件, 该文件为 Django 数据库文件, 在默认情况下 Django 配置了文件型的数据库, python 自带了 SQLite 驱动. Django 支持多种流行数据库, 详细请看数据库参考文档
下面以连接 MySQL 为例
(1). 进入虚拟机, 安装 pymysql:pip install pymysql
(2). 创建数据库用户:
? 1).-- 创建用户'willy', 密码为'123456'
MySQL> create user 'willy'@'%' identified by '123456'
? 2). 赋予权限
MySQL> grand all on *.* to 'willy'@'%'
? 3). 权限生效
MySQL> flush privileges
(3). 在进入新用户, 并创建数据库 "crm":
- MySQL -A -uwilly -p123456 #进入新用户
- create database crm; #创建数据库
(4). 在主 setting.py 中找到模板设置 DATABASES, 并进行配置
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.mysql', # 数据库引擎
- 'NAME': 'crm', # 数据库名称
- 'USER':'willy', # 连接数据库的用户名
- 'PASSWORD':'123456', # 连接数据库的密码
- 'HOST':'127.0.0.1', # MySQL 服务器的域名和 IP 地址
- 'PORT':'3306', # MySQL 服务器的端口, 默认为 3306
- }
- }
'NAME'为创建的数据库名称,'USER'和'PASSWORD'分别为新建的新用户和密码, 必须与上面设置的相同.
(5). 修改项目目录下的__init__.py (和 settings.py 文件在同一个目录)
- import pymysql
- pymysql.install_as_MySQLdb()
(6). 在主 setting.py 中找到 TIME_ZONE, 设置时区: TIME_ZONE = 'Asia/ShangHai'
- LANGUAGE_CODE = 'en-us'
- TIME_ZONE = 'Asia/Shanghai'
- USE_I18N = True
- USE_L10N = True
- USE_TZ = True
3. 模型创建与激活
连接数据库后, 需要创建并激活模型, 基本流程如下
(1). 创建模型
定义模型必须写在 App 下的 model.py 文件中, 如在 student/model.py: 创建 Student 的模型, 代表学生
- from django.db import models
- # Create your models here.
- class Student(models.Model):
- name = models.CharField(max_length=20) # 字符串, max_length 必须给
- age = models.SmallIntegerField(default=0) # default 默认值
- sex = models.SmallIntegerField(default=1)
- qq = models.CharField(max_length=20, default='')
- phone = models.CharField(max_length=20, default='')
- c_time = models.DateTimeField(verbose_name='报名时间',
- auto_now_add=True)
- def __str__(self):
- return '%s-%s' %(self.name, self.age)
总结:
? 1). 任何模型都是 django.db.models.Model 的子类
? 2). 类变量 (属性) 表示模型中的数据库字段
? 3). 每一个字段由一个字段类的实例表示, 如字符字段用 CharField 表示, 日期字段用 DateTimeField 表示
(2). 激活模型
? 1)注册 App:
在主 settings.py 下的 INSTALLED_APPS 注册应用'student'
? 2)创建迁移(在项目根目录下):
迁移是 Django 对模型的更改方式, 告诉 Django 我们做了哪些数据库更改, 会在 App/migrations 下生成类似 "0001_initial.py" 的数据库迁移文件
python manage.py makemigrations student
注: 若果不加 "student", 就会对 settings 中注册的所有 App 都进行迁移
? 3)查看 SQL 语句
获取迁移的 SQL 语句, 可以看出 Django 的模型会自动创建'id'主键, 表名的形式为: 应用名_模块名小写
python manage.py sqlmigrate student 0001
? 4). 应用迁移
创建迁移后, 在 MySQL 中还没用建立表, 需要运行 migrate 命令, 将迁移文件中的映射数据提交数据库
python manage.py migrate student
注: 如果要删除表, 可以在 django 模型中注释模型类, 然后执行应用命令, 不能手动在命令行删除.
3. 数据的增删改查
通过命令进入 django shell 调试工具, 然后进行数据的增删改查, 首先安装 ipython
- (djenv) pyvip@VIP:~/DjProjects/crm$ pip install ipython # 安装 ipython
- (djenv) pyvip@VIP:~/DjProjects/crm$ python manage.py shell # 进入 shell 调试工具
- In[1]:from student.models import Student # 导入模型, 进行操作
接下来进行增删改查操作
(1). 增加操作
如增加 s1,s2,s3,s4 学生信息
- # 方法一:
- In [1]: s1 = Student(name="Kitty", age=18, sex=0, qq="468531576")
- In [2]: s1.save()
- # 方法二:
- In [3]: s2 = Student()
- In [4]: s2.name = 'Tom'
- In [5]: s2.age= 21
- In [6]: s2.save()
- # 方法三:
- In [7]: Student.objects.create(name='Kate', age=20, phone='13647254681')
- # 方法四:
- In [8]: Student.objects.get_or_create(name='Rose', age=19, sex=0, phone='18647523473')
(2). 查询操作
- # 方法一: 查询所有记录对象, 输出 QuerySet 对象
- In [9]: Student.objects.all()
- Out[9]: <QuerySet [<Student: Kitty-18>,<Student: Tom-21>,<Student: Kate-20>,<Student: Rose-19>]>
- # 方法二: 过滤查询. 输出 QuerySet 对象
- In [10]: Student.objects.filter(sex=1)
- Out[10]: <QuerySet [<Student: Tom-21>,<Student: Kate-20>]>
- # 方法三: 查询一个记录对象, 输出单个对象, 如果查询的对象有多个时会报错, 与 id 一起用
- In [11]: Student.objects.get(id=2)
- Out[11]: <QuerySet [<Student: Tom-21>]>
- In [12]: s = Student.objects.get(id=2)
- In [13]: s .c_time
- Out[13]: datetime.datetime(2019, 2, 24, 9, 10, 20, 987070, tzinfo=<UTC>)
从数据库中查询出来的结果一般是一个集合, 这个集合称为 QuerySet, 他是一个可迭代对象, 可以通过 for 循环, 正向切片的方式进行取值, 可以通过 list 强行将 QuerySet 变成列表
(3). 更改操作
如把 Kate 的'sex'改成'0','Tom'的年龄改成'19'
- # 修改 1 条
- In [14]: s = Student.objects.get(name='Kate')
- In [15]: s.sex = 0
- In [16]: s.save()
- In [17]: Student.objects.get(name='Kate').sex
- Out[17]: 0
- # update()修改多条数据
- In [18]: Student.objects.filter(name='Tom').update(age=19)
- Out[18]: 1 # 返回修改的条数
- In [19]: Student.objects.get(name='Tom').age
- Out[19]: 19
(4). 删除操作
如删除学生'Rose', 删除所有女生
- # 修改 1 条
- In [20]: s = Student.objects.get(name='Rose')
- In [21]: s.delete()
- Out[21]: (1, {
- 'student.Student'
- }: 1)
- # 修改多条
- In [22]: s = Student.objects.filter(sex=0).delete
- Out[22]: (3, {
- 'student.Student
- }: 3)
Django 入门 -- 模型系统(一)
来源: http://www.bubuko.com/infodetail-2974435.html