• 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="
    ")
    <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
  • 相关阅读:
    8月的list
    hdu 2853
    【问题交流】JAVA 基础 switch 执行顺序的问题
    h5/css动态旋转木马源码
    javascript系列丛书之读后感
    java运行闪退,报错如下,是因为ole32.dll的问题吗?
    js
    切换为文本框编辑状态,点击空白区域保存修改
    前端工程师源码分享:html5 2d 扇子
    2017武汉马拉松4月9日开跑啦~~~
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/10134448.html
Copyright © 2020-2023  润新知