ORM介绍

  

  对象关系映射(Object Relational Mapping,简称ORM)模式的作用是在关系型数据库与业务实体对象之间进行映射,这使得我们不需要再去和复杂的SQL语句打交道,只需要简单的操作对象的属性和方法。ORM通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。

  ORM的优势体现在以下三个方面:

  1. 可移植性强,在Django中只需要在settings.py文件中修改新数据库的配置,然后进行迁移数据的操作即可完成数据库的移植,二部需要对ORM进行任何修改

  2. 查询语法简单,让软件开发人员专注于业务逻辑的处理,提高了开发效率

ORM在Django中的应用

字段

  1. AutoField(Field)
  2. - int自增列,必须填入参数 primary_key=True
  3.  
  4. BigAutoField(AutoField)
  5. - bigint自增列,必须填入参数 primary_key=True
  6.  
  7. 注:当model中如果没有自增列,则自动会创建一个列名为id的列
  8. from django.db import models
  9.  
  10. class UserInfo(models.Model):
  11. # 自动创建一个列名为id的且为自增的整数列
  12. username = models.CharField(max_length=32)
  13.  
  14. class Group(models.Model):
  15. # 自定义自增列
  16. nid = models.AutoField(primary_key=True)
  17. name = models.CharField(max_length=32)
  18.  
  19. SmallIntegerField(IntegerField):
  20. - 小整数 -32768 32767
  21.  
  22. PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
  23. - 正小整数 0 32767
  24. IntegerField(Field)
  25. - 整数列(有符号的) -2147483648 2147483647
  26.  
  27. PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
  28. - 正整数 0 2147483647
  29.  
  30. BigIntegerField(IntegerField):
  31. - 长整型(有符号的) -9223372036854775808 9223372036854775807
  32.  
  33. BooleanField(Field)
  34. - 布尔值类型
  35.  
  36. NullBooleanField(Field):
  37. - 可以为空的布尔值
  38.  
  39. CharField(Field)
  40. - 字符类型
  41. - 必须提供max_length参数, max_length表示字符长度
  42.  
  43. TextField(Field)
  44. - 文本类型
  45.  
  46. EmailField(CharField):
  47. - 字符串类型,Django Admin以及ModelForm中提供验证机制
  48.  
  49. IPAddressField(Field)
  50. - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
  51.  
  52. GenericIPAddressField(Field)
  53. - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4Ipv6
  54. - 参数:
  55. protocol,用于指定Ipv4Ipv6 'both',"ipv4","ipv6"
  56. unpack_ipv4 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"
  57.  
  58. URLField(CharField)
  59. - 字符串类型,Django Admin以及ModelForm中提供验证 URL
  60.  
  61. SlugField(CharField)
  62. - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
  63.  
  64. CommaSeparatedIntegerField(CharField)
  65. - 字符串类型,格式必须为逗号分割的数字
  66.  
  67. UUIDField(Field)
  68. - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
  69.  
  70. FilePathField(Field)
  71. - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
  72. - 参数:
  73. path, 文件夹路径
  74. match=None, 正则匹配
  75. recursive=False, 递归下面的文件夹
  76. allow_files=True, 允许文件
  77. allow_folders=False, 允许文件夹
  78.  
  79. FileField(Field)
  80. - 字符串,路径保存在数据库,文件上传到指定目录
  81. - 参数:
  82. upload_to = "" 上传文件的保存路径
  83. storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
  84.  
  85. ImageField(FileField)
  86. - 字符串,路径保存在数据库,文件上传到指定目录
  87. - 参数:
  88. upload_to = "" 上传文件的保存路径
  89. storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
  90. width_field=None, 上传图片的高度保存的数据库字段名(字符串)
  91. height_field=None 上传图片的宽度保存的数据库字段名(字符串)
  92.  
  93. DateTimeField(DateField)
  94. - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
  95.  
  96. DateField(DateTimeCheckMixin, Field)
  97. - 日期格式 YYYY-MM-DD
  98.  
  99. TimeField(DateTimeCheckMixin, Field)
  100. - 时间格式 HH:MM[:ss[.uuuuuu]]
  101.  
  102. DurationField(Field)
  103. - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
  104.  
  105. FloatField(Field)
  106. - 浮点型
  107.  
  108. DecimalField(Field)
  109. - 10进制小数
  110. - 参数:
  111. max_digits,小数总长度
  112. decimal_places,小数位长度
  113.  
  114. BinaryField(Field)
  115. - 二进制类型
  116.  
  117. 字段相关内容

自定义字段 

  1. class FixedCharField(models.Field):
  2. """
  3. 自定义的char类型的字段类
  4. """
  5. def __init__(self, max_length, *args, **kwargs):
  6. self.max_length = max_length
  7. super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)
  8.  
  9. def db_type(self, connection):
  10. """
  11. 限定生成数据库表的字段类型为char,长度为max_length指定的值
  12. """
  13. return 'char(%s)' % self.max_length
  14.  
  15. class Class(models.Model):
  16. id = models.AutoField(primary_key=True)
  17. title = models.CharField(max_length=25)
  18. # 使用自定义的char类型的字段
  19. cname = FixedCharField(max_length=25)
  1. PS: 返回值为字段在数据库中的属性,Django字段默认的值为:
  2. 'AutoField': 'integer AUTO_INCREMENT',
  3. 'BigAutoField': 'bigint AUTO_INCREMENT',
  4. 'BinaryField': 'longblob',
  5. 'BooleanField': 'bool',
  6. 'CharField': 'varchar(%(max_length)s)',
  7. 'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
  8. 'DateField': 'date',
  9. 'DateTimeField': 'datetime',
  10. 'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
  11. 'DurationField': 'bigint',
  12. 'FileField': 'varchar(%(max_length)s)',
  13. 'FilePathField': 'varchar(%(max_length)s)',
  14. 'FloatField': 'double precision',
  15. 'IntegerField': 'integer',
  16. 'BigIntegerField': 'bigint',
  17. 'IPAddressField': 'char(15)',
  18. 'GenericIPAddressField': 'char(39)',
  19. 'NullBooleanField': 'bool',
  20. 'OneToOneField': 'integer',
  21. 'PositiveIntegerField': 'integer UNSIGNED',
  22. 'PositiveSmallIntegerField': 'smallint UNSIGNED',
  23. 'SlugField': 'varchar(%(max_length)s)',
  24. 'SmallIntegerField': 'smallint',
  25. 'TextField': 'longtext',
  26. 'TimeField': 'time',
  27. 'UUIDField': 'char(32)',

mysql操作

1. 环境

  windows/python3.6.0/mysql/MySQLdb,若对mysql操作不熟悉可以查看数据库之MySql

2. 进入root,创建新账户

  mysql -u root -p

  create user "hello"@"local" identifild by "123456789";

3. 创建djangodb数据库

  create database IF NOT EXISTS 'djangodb';

4. 为新用户授权

  grant all privileges on djangodb.* to "hello"@"localhost";

  flush privileges;

5. 退出root用hello账户登录,查看数据库

  mysql -u hello -p

  mysql show databases;

  

django操作mysql

1. 创建工程和应用

  django-admin startproject django_mysql

  python manage.py startapp blog

  可以使用tree /f查看django_mysql目录,以下为blog目录结构

   

2. 修改setting.py文件中和数据库相关的设置

  1. DATABASES = {
  2. 'default': {'ENGINE':'django.db.backends.mysql',
  3. 'HOST':'127.0.0.1',
  4. 'PORT':'',
  5. 'NAME':'djangodb',
  6. 'USER':'hello',
  7. 'PASSWORD':'',
  8. }

3. 通过模型设计数据表

  ./blog/model.py

  1. from django.db import models
  2.  
  3. # Create your models here.
  4. from django.db import models #特别注意
  5.  
  6. class userinfo(models.Model):
  7. username=models.CharField(max_length=32)
  8. password=models.CharField(max_length=32)
  9. age=models.IntegerField()

4. 向数据表中添加项

  ./blog/views.py

  1. from django.shortcuts import HttpResponse
  2. from .models import userinfo
  3. # Create your views here.
  4. def db_handle(request):
  5. #向数据库中添加数据
  6. #dic = {"username":"bruce","password":"123456","age":23}
  7. #dic = {"username":"zhanglin","password":"666666","age":18}
  8. dic = {"username":"lishi","password":"", "age":99}
  9. objects = userinfo.objects.all()
  10. print (objects)
  11. isexists = False
  12. if not objects and not isexists:
  13. userinfo.objects.create(**dic)
  14. else:
  15. for object in objects:
  16. print(object)
  17. if dic["username"] == object.username:
  18. isexists = True
  19. #HttpResponse("username is exits\r\t") #该语句为什么没起作用
  20. break
  21. if not isexists:
  22. userinfo.objects.create(**dic)
  23.  
  24. #删除数据
  25. #userinfo.objects.filter(username="bruce").delete()
  26.  
  27. #更新数据
  28. #userinfo.objects.filter(username="lishi").update(age=99)
  29. #HttpResponse("ok")
  30.  
  31. return render(request, "mysql.html", {"tablerow":objects})

  上面的代码中包含了向数据库中添加、删除和更新数据

5. 测试

  打开django服务,数据url

  python manage.py runserver

  http://127.0.0.1:8000/db_handle/

  在mysql中查看数据库

  

  图中的blog_userinfo就是我们的数据表,命名方式:应用+models.py中的userinfo函数

  

渲染

  接下来我们将数据库内容通过html显示到网页上

1. 添加templates相关信息

  settings.py文件中设置templates路径

  1. TEMPLATES = [
  2. {
  3. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  4. 'DIRS': [os.path.join(BASE_DIR, 'templates'), ],
  5. 'APP_DIRS': False,
  6. 'OPTIONS': {
  7. 'context_processors': [
  8. 'django.template.context_processors.debug',
  9. 'django.template.context_processors.request',
  10. 'django.contrib.auth.context_processors.auth',
  11. 'django.contrib.messages.context_processors.messages',
  12. ],
  13. },
  14. },
  15. ]

  在django_mysql添加templates目录并添加mysql.html文件

  1. <!DOCTYPE html>
  2. <html lang="zh-cn">
  3. <head>
  4. <meta http-equiv="X-UA_compatible" content="IE=Edge">
  5. <meta charset="utf-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>django_mysql info</title>
  8. </head>
  9. <body>
  10. <h1>django_mysql info</h1>
  11. <div class="container">
  12. <table border="" width="">
  13. <tr>
  14. <th>用户名</th>
  15. <th>密码</th>
  16. <th>年龄</th>
  17. </tr>
  18. {%for row in tablerow%}
  19. <tr>
  20. <td>{{row.username}}</td>
  21. <td>{{row.password}}</td>
  22. <td>{{row.age}}</td>
  23. </tr>
  24. {%endfor%}
  25. </table>
  26. </div>
  27. </body>
  28. </html>

2. 添加urls

  在应用的urls.py文件中添加如下信息

  1. from django.contrib import admin
  2. from django.urls import path
  3.  
  4. from blog import views
  5.  
  6. urlpatterns = [
  7. path('admin/', admin.site.urls),
  8. path(r'db_handle/', views.db_handle),
  9. ]

3. 渲染的代码已经在views.py中添加

  1. return render(request, "mysql.html", {"tablerow":objects})

4. 打开http://127.0.0.1:8000/db_handle/测试
  

若要查看django更多详细信息,可以参考:django初探-创建简单的博客系统(一)django初探-创建简单的博客系统(二)

Django之ORM模型的更多相关文章

  1. django创建ORM模型、通过ORM模型操作单个表、ORM模型常用字段

    一.ORM简介 ORM ,全称Object Relational Mapping,中文叫做对象关系映射,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句.通过把表映射成类,把行作 ...

  2. python django -2 ORM模型

    ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射”的简称 ...

  3. Django中ORM模型总结(一)[概述,查询语句]

    理解ORM框架 概述 O:(objects)->类和对象. R:(Relation)->关系,关系数据库中的表格. M:(Mapping)->映射. 作用: 可以通过类和类对象就可以 ...

  4. Django ORM模型的一点体会

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 使用Python的Django模型的话,一般都会用它自带的ORM(Object-relational ma ...

  5. Django ORM模型:想说爱你不容易

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 使用Python的Django模型的话,一般都会用它自带的ORM(Object-relational ma ...

  6. django ORM模型表的一对多、多对多关系、万能双下划线查询

    一.外键使用 在 MySQL 中,如果使用InnoDB引擎,则支持外键约束.(另一种常用的MyIsam引擎不支持外键) 定义外键的语法为fieldname=models.ForeignKey(to_c ...

  7. Django (学习第二部 ORM 模型层)

    Django对数据库的操作 Django的 ORM 简介 ORM操作 (增删改查) ORM操作数据库的增删改查 ORM创建表关系 ORM中常用字段及参数 数据库的查询优化 ORM中如何开启事务 ORM ...

  8. Django(10)ORM模型介绍

    前言 随着项目越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了: 1.SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长.会出现很多相近的SQL语句. 2. ...

  9. Django之ORM对象关系模型

    MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需 ...

随机推荐

  1. dojo之dojox/data/CsvStore初始化

    dojo之dojox/data/CsvStore初始化 1.var csvStore = new dojox.data.CsvStore({url:"student.csv"}); ...

  2. vxWorks/BootROM Imageq启动顺序详解

    vxWorks/BootROM Imageq启动顺序详解 VxWorks image     分为在ROM中运行和在RAM中运行两种,两者启动顺序的区别在于sysInit()函数的调用,该函数在RAM ...

  3. Flex读取txt文件中的内容(二)

    Flex读取txt文件中的内容 自动生成的文件 LoadTxt-app.xml: <?xml version="1.0" encoding="utf-8" ...

  4. 芝麻HTTP:JavaScript加密逻辑分析与Python模拟执行实现数据爬取

    本节来说明一下 JavaScript 加密逻辑分析并利用 Python 模拟执行 JavaScript 实现数据爬取的过程.在这里以中国空气质量在线监测分析平台为例来进行分析,主要分析其加密逻辑及破解 ...

  5. 浅谈Javascript中的Label语句

    如: begin: for (var i = 0; i < 10 ; i++ ){ alert(i); } 举一个比较典型的例子,看完后即明白 Label 的应用:(未添加 Label) var ...

  6. HALCON学习-下载、安装

    下载地址: 官网 HALCON学习网 安装: 直接安装文件halcon-12.0-windows-x86.exe 破解,汉化: 在HALCON学习网中有Licence文件“license_suppor ...

  7. Selenium简介与环境搭配-----Selenium快速入门(一)

    Selenium是一套自动化测试框架.官方网站是:https://www.seleniumhq.org/  某些童鞋访问可能需要FQ. Selenium支持多种语言开发,例如Java,Python,C ...

  8. 【小白学爬虫连载(10)】–如何用Python实现模拟登陆网站

    Python如何实现模拟登陆爬取Python实现模拟登陆的方式简单来说有三种:一.采用post请求提交表单的方式实现.二.利用浏览器登陆网站记录登陆成功后的cookies,采用get的请求方式,传入c ...

  9. Java汉字乱码问题

    window->preferences->输入框输入"encod" 将text file encoding 从default改成other utf-8 同理,css,H ...

  10. hadoop新增kerberos租户

    第一步 在kerberos服务器所在主机 通过kadmin.local,也可以通过kadmin 输入用户密码登录 kadmin.local: addprinc -randkey it1@STARYEA ...