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

 

posted @ 2018-12-17 22:37  尹正杰  阅读(867)  评论(0编辑  收藏  举报