zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 传球游戏
    Java实现 蓝桥杯VIP 算法训练 Hanoi问题
    Java实现 蓝桥杯VIP 算法训练 蜜蜂飞舞
    Java实现 蓝桥杯VIP 算法训练 奇偶判断
    Java实现 蓝桥杯VIP 算法训练 传球游戏
    Java实现 蓝桥杯VIP 算法训练 Hanoi问题
    Java实现 蓝桥杯VIP 算法训练 Hanoi问题
    Java实现 蓝桥杯VIP 算法训练 蜜蜂飞舞
    Java实现 蓝桥杯VIP 算法训练 蜜蜂飞舞
    Qt: 访问容器(三种方法,加上for循环就四种了)good
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/10134448.html
Copyright © 2011-2022 走看看