Django 2.2.x版本的ORM API实战案例
Django 2.2.x版本的ORM API实战案例
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.Django ORM概述
1>.什么是ORM
ORM,对象关系映射,对象和关系之间的映射,使用面向对象的方式来操作数据库。
从效果上说,其实是创建了一个可在编程语言中使用的“虚拟对象数据库”,通过对虚拟对象数据库操作从而实现对目标数据库的操作,虚拟对象数据库与目标数据库是相互对应的。在Django中,虚拟对象数据库也称为模型,通过模型可以对目标数据库的进行读写操作。
2>.ORM能做的啥事情
第一:操作数据表(包括创建表,删除表和修改表); 第二:操作数据行(对数据的增删改查); 注意:
ORM不能创建数据库,需要我们手动创建对应的 数据库,建议将数据库的字符编码设置为utf8mb4.
3>.使用Django的ORM详细步骤
(1)自己手动创建数据库; (2)在Django项目中配置链接数据库的相关配置(在Django项目中的setting.py中设置); (3)Django用什么链接数据库,Django默认是使用MySQLDB(最有名的库。对MySQL的 Client封装实现,遗憾的是,它仅支持Python 2,不更新了,不支持Python3) (4)在我们项目中的应用模块中找到对应的models.py文件,在这里面创建一个类,这个类必须得继承“model.Model”; (5)创建好类后,我们需要在项目目录下手动执行“python manage.py makemigrations”(将你每次在model.py修改的操作在“migrations”目录中记录下来并生成对应的文件,比如“0001_initial.py”)和“python manage.py migrate”(翻译你在model.py中的定义的SQL语句并执行!) 接下来我们会详细剖析一下ORM的使用,此处我们使用ORM是针对Django 1.11.11这个版本,后期我会更新一片关于Django.2.2.x这个版本的使用,其实2在用法中差异不大。如果时间允许的话,我会一一给大家分享出来的。
二.Pycharm 链接MySQL工具的使用
1>.点击“Database”
2>.选择需要链接的数据库
3>.下载驱动,如下图所示,点击蓝色的“Download”按钮
4>.链接数据库测试
5>.查看某个表中的数据(我自己把之前删除的那个表给还原了)
6>.往某张表中添加数据
7>.再次查看表中的信息
三.Django ORG的数据类型介绍
1>.字段类型(https://docs.djangoproject.com/en/2.2/ref/models/fields/#field-types)
AutoField: 自增的整数字段。 如果不指定,django会为模型类自动增加主键字段,即缺省主键。 缺省情况下,Django的每一个Model都有一个名为id的AutoField字段,如下: id = models.AutoField(primary_key=True) 如果显式定义了主键,这种缺省主键就不会被创建了。Python之禅中说“显式优于隐式”,所以,尽量使用自己定义的主键,哪怕该字段名就是id,也是一种不错的选择。 BooleanField 布尔值字段,True和False 对应表单控件CheckboxInput NullBooleanField 比BooleanField多一个null值 CharField 字符串,max_length设定字符长度 对应表单控件TextInput TextField 大文本字段,一般超过4000个字符使用 对应表单控件Textarea IntegerField 整数字段 BigIntegerField 更大整数字段,8字节 DecimalField 使用Python的Decimal实例表示十进制浮点数。max_digits总位数, decimal_places小数点后的位数 FloatField Python的Float实例表示的浮点数 DateField 使用Python的datetime.date实例表示的日期 auto_now=False每次修改对象自动设置为当前时间。 auto_now_add=False对象第一次创建时自动设置为当前时间。 auto_now_add、auto_now、default互斥 对应控件为TextInput,关联了一个Js编写的日历控件 TimeField 使用Python的datetime.time实例表示的时间,参数同上 DateTimeField 使用Python的datetime.datetime实例表示的时间,参数同上 FileField 一个上传文件的字段 ImageField 继承了FileField的所有属性和方法,但是对上传的文件进行校验,确 保是一个有效的图片 EmailField 能做Email检验,基于CharField,默认max_length=254 GenericIPAddressField 支持IPv4、IPv6检验,缺省对应文本框输入 URLField 能做URL检验,基于基于CharField,默认max_length=200
2>.字段选项(https://docs.djangoproject.com/en/2.2/ref/models/fields/#field-options)
db_column: 表中字段的名称。如果未指定,则使用属性名 primary_key: 是否主键 unique: 是否是唯一键 default: 缺省值。这个缺省值不是数据库字段的缺省值,而是新对象产生的时候被填入的缺省值 null: 表的字段是否可为null,默认为False blank: Django表单验证中,是否可以不填写,默认为False db_index: 字段是否有索引
3>.关系类型字段类(https://docs.djangoproject.com/en/2.2/ref/models/fields/#module-django.db.models.fields.related)
ForeignKey: 外键,表示一对多,ForeignKey('production.Manufacturer'), 自关联ForeignKey('self ') 一对多时,自动创建会增加_id后缀。 从一访问多,使用"对象.小写模型类_set" ManyToManyField: 表示多对多 OneToOneField: 表示一对一 从一访问一,使用"对象.小写模型类" 访问id:"对象.属性_id"
四.管理器对象
1>.管理器对象
Django会为模型类提供一个objects对象,它是django.db.models.manager.Manager类型,用于与数据库交互。当定义模型类的时候没有指定管理器,则Django会为模型类提供一个objects的管理器。
如果在模型类中手动指定管理器后,Django不再提供默认的objects的管理器了。
管理器是Django的模型进行数据库查询操作的接口,Django应用的每个模型都至少拥有一个管理器。
用户也可以自定义管理器类,继承自django.db.models.manager.Manager,实现表级别控制。
2>.查询案例
1 #!/usr/bin/env python 2 #_*_conding:utf-8_*_ 3 #@author :yinzhengjie 4 #blog:http://www.cnblogs.com/yinzhengjie 5 6 import os 7 import django 8 9 #参考salary/wsgi.py文件 10 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'salary.settings') 11 django.setup(set_prefix=False) 12 13 #导入employee应用的models模块中定义的Employee类 14 from employee.models import Employee 15 16 #返回一个结果集,本句不发起查询 17 emps = Employee.objects.all() 18 19 print(type(emps)) 20 21 #查询所有员工,这个过程发起了查询,可以从终端的是输出信息来判断。 22 print(*list(emps),sep="\n")
<class 'django.db.models.query.QuerySet'> (0.001) SELECT @@SQL_AUTO_IS_NULL; args=None (0.001) SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; args=None (0.001) SELECT `employees`.`emp_no`, `employees`.`birth_date`, `employees`.`first_name`, `employees`.`last_name`, `employees`.`gender`, `employees`.`hire_date` FROM `employees`; args=() <Employee: 10001 Georgi Facello> <Employee: 10002 Bezalel Simmel> <Employee: 10003 Parto Bamford> <Employee: 10004 Chirstian Koblick> <Employee: 10005 Kyoichi Maliniak> <Employee: 10006 Anneke Preusig> <Employee: 10007 Tzvetan Zielinski> <Employee: 10008 Saniya Kalloufi> <Employee: 10009 Sumant Peac> <Employee: 10010 Duangkaew Piveteau> <Employee: 10011 Mary Sluis> <Employee: 10012 Patricio Bridgland> <Employee: 10013 Eberhardt Terkki> <Employee: 10014 Berni Genin> <Employee: 10015 Guoxiang Nooteboom> <Employee: 10016 Kazuhito Cappelletti> <Employee: 10017 Cristinel Bouloucos> <Employee: 10018 Kazuhide Peha> <Employee: 10019 Lillian Haddadi> <Employee: 10020 Mayuko Warwick>
五.博主推荐阅读
pymysql详解: https://www.cnblogs.com/yinzhengjie/p/11938524.html Django ORM的数据库迁移: https://www.cnblogs.com/yinzhengjie/p/11939482.html Django ORM的单表查询: https://www.cnblogs.com/yinzhengjie/p/11945529.html Django ORM的一对多查询: https://www.cnblogs.com/yinzhengjie/p/11946698.html Django ORM的多对多查询: https://www.cnblogs.com/yinzhengjie/p/11954411.html
本文来自博客园,作者:尹正杰,转载请注明原文链接:https://www.cnblogs.com/yinzhengjie/p/10134448.html,个人微信: "JasonYin2020"(添加时请备注来源及意图备注,有偿付费)
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。