django框架基础-ORM基础-长期维护
############### ORM介绍 ################
- """
- ORM简介:
- ORM 全拼Object-Relation Mapping.
- 中文意为 对象-关系映射.
- 在MVC/MVT设计模式中的Model模块中都包括ORM
- 在django里面主要是在models.py文件里面设计模型类,
- ORM和数据库关系:
- 类--数据表
- 对象--数据行
- 属性--字段,理清了这三点,ORM就没有问题
- ORM的优点:
- 1,不用编写各种数据库的sql语句,让软件开发人员专注于业务逻辑的处理,提高了开发效率。
2, 实现了数据模型和数据库之间的解耦,通过配置就可以更换数据库了- ORM的缺点:
- 1:根据对象的操作转换成SQL语句,根据查询的结果转化成对象,orm翻译成sql的过程 在映射过程中有性能损失.
- 如果一个公司对执行效率要求比较高,不如原生的sql效率高,但是web操作orm足够了,
- ORM能做的事情:
- 1,操作数据表,创建表,修改表,删除表,
- 2,操作数据行,数据的增删查改,
- 注意:
- 1,要自己创建数据库
- 2,使用mysql数据库需要配置,
- """
###################################################
- """
- 谈一谈你对ORM的理解:
- ORM是“对象-关系-映射”的简称。
- MVC或者MVC框架中包括一个重要的部分,就是ORM,
- 它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,
- 通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动
- """
############### ORM使用mysql的基本配置 ################
- # 配置使用mysql数据库
- # 第一步:在项目目录下-项目文件夹下-settings文件中,
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.mysql',
- 'NAME': 'XXX',
- 'USER': 'root',
- 'PASSWORD': 'XXX',
- 'HOST': 'localhost',
- 'PORT':3306,
- }
- }
- # 第二步:在项目目录下-项目文件夹下-__init__文件中,替代默认的mysqldb,因为这个不支持Python3,
- import pymysql
- pymysql.install_as_MySQLdb()
- #创建数据库
- # ORM可以操作数据表,操作数据行,但是不能创建数据库,需要自己创建数据库,这是使用mysql的情况下
- # 如果你使用SQLite,你不需要事先创建任何东西 —— 数据库文件将会在需要的时候自动创建。
- cmd
- mysql -uroot -p
- create database XXXXX;
- use django
- show tables;
############### ORM-字段类型 ################
- """
- 字段类型:
- 定义属性的格式:
- 属性名 = models.字段类型,定义属性时需要指定字段类型, 通过字段类型的参数指定选项
- 属性名定义的注意点:
- 1,不允许使用python的保留关键字
- 2,不允许使用mysql的保留关键字
- 3,不允许使用连续的下划线,因为Django的查询语法就是连续的下划线
- 常用字段类型:
- 1,AutoField:自动增长的IntegerField, 不指定时Django会自动创建属性名为id的自动增长属性
- 参数primary_key=True,必须填入。
- 2,BooleanField:布尔字段,值为True或False
- 3,NullBooleanField:支持Null、True、False三种值
- 4,CharField(max_length=20):字符串,
- 参数max_length表示最大字符个数,这个参数是必须的,
- 5,TextFiled:大文本字段,一般超过4000个字符时使用。新闻就可以使用这个字段,备注也可以,
- 6,IntegerField:整数,范围在10位,所以不能保存手机号,
- 7,DecimalField(max_digits=None, decimal_places=None):可以指定精度的十进制浮点数,这个精度比float要高,float存进计算机和取出来,是有差异的,
- 参数max_digits表示总位数
- 参数decimal_places表示小数位数
- 8,FloatField():浮点数
- 9,DateField[auto_now=False, auto_now_add=False]):日期,日期格式 YYYY-MM-DD,
- 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false
- 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false
- 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误,两个参数不是必须的,
- 10,TimeField:参数和DateField一样
- 11,DateTimeField:日期时间,参数同DateField,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],
- 12,FileField:上传文件字段,以二进制的形式
- 13,ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片
- """
实例:
- from django.db import models
- class Test(models.Model):
- id = models.AutoField(primary_key=True)
- isnum=models.BooleanField()
- # isnum2=models.NullBooleanField
- name = models.CharField(max_length=20,unique=True)
- text=models.TextField()
- age=models.IntegerField()
- price=models.DecimalField(max_digits=10,decimal_places=2)
- # price2 =models.FloatField(max_digits=10,decimal_places=2)
- create_time=models.DateField(auto_now_add=True)
- update_time = models.DateField(auto_now=True)
- time=models.TimeField()
- data_time=models.DateTimeField(null=False)
- file=models.FileField()
- image=models.ImageField()
如何设置一个带有枚举值的字典?
- gender_choices = (
- (1, '男'),
- (2, '女'),
- )
- gender = models.IntegerField(verbose_name='性别', choices=gender_choices, default=1)
############### ORM-字段选项 ###############
- '''
- 字段选项:
- 1,null:如果为True,表示允许为空,默认值是False
- 2,blank:如果为True,则该字段允许为空白,默认值是False
- 对比:null是数据库范畴的概念,blank是表单验证范畴的
- 3,db_column:字段的名称,如果未指定,则使用属性的名称(只限于数据库表中的名字,操作数据库还是类属性的名字)
- 4,db_index:若值为True, 则在表中会为此字段创建索引,默认值是False(为了优化查询速度 )
- 5,default:默认值,这可以是值或可调用对象。如果可调用,则每次创建新对象时都会调用它。
- 6,primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
- 7,unique:如果为True, 这个字段在表中必须有唯一值,这个值不能重复,默认值是False
- 8,时间字段独有,DatetimeField、DateField、TimeField这个三个时间字段,都可以设置如下属性。
- 配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
- 配置上auto_now=True,每次更新数据记录的时候会更新该字段
- # 注意:default和blank不影响表的结构,不需要做迁移,其他的都要迁移,
- 注意:Django会自动为表创建主键字段
- 如果使用选项设置某属性为主键字段后,Django不会再创建自动增长的主键字段
- 默认创建的主键字段为id,可以使用pk代替,pk全拼为primary key
- """
############### ORM-字段选项 ###############
- 解释blank和null
- 网上介绍这两者区别和联系的博客大部分都只说明了两点:
- blank用于表单的认证,被设为blank=False(默认为False)的字段在填写表单时不能为空。
- null用于规定数据库中的列的非空性,被设为null=False(默认为False)的字段在数据库中对应的列不能为空(用SQL来说明就是为该列添加了NOT NULL的约束)。
############### ORM-关系字段类型 ################
- """
- 关系字段类型:
- 关系型数据库的关系包括三种类型:
- 1,ForeignKey:一对多,将字段定义在多的一端中
- 参数:
- to 设置要关联的表
- to_field 设置要关联的表的字段
- related_name 反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。
- related_query_name 反向查询操作时,使用的连接前缀,用于替换表名。
- on_delete 当删除关联表中的数据时,当前表与其关联的行的行为。
- # models.CASCADE 删除关联数据,与之关联也删除
- # models.SET_NULL 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
- db_constraint 是否在数据库中创建外键约束,默认为True。
- 2,OneToOneField:一对一,将字段定义在任意一端中
- 参数:
- to 设置要关联的表
- to_field 设置要关联的表的字段
- on_delete 当删除关联表中的数据时,当前表与其关联的行的行为。
- 3,ManyToManyField:多对多,将字段定义在任意一端中
- 用于表示多对多的关联关系。在数据库中通过第三张表来建立关联关系。
- 参数:
- to 设置要关联的表
- related_name 反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'。
- related_query_name 反向查询操作时,使用的连接前缀,用于替换表名。
- symmetrical 仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True。
- through 在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。
- 但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名。
- through_fields 设置关联的字段。
- db_table 默认创建第三张表时,数据库中表的名称。
- """
############### ORM-元信息 ################
- """
- 元信息
- ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。
- 主要字段如下:
- db_table ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名。
- 工作中一定要指定表名,否则改动了程序app的名字,迁移的时候就会出问题,
- index_together 联合索引。
- unique_together 联合唯一索引。
- ordering 指定默认按什么字段排序。只有设置了该属性,我们查询到的结果才可以被reverse()。
- verbose_name 指定在admin管理界面中显示中文;verbose_name表示单数形式的显示,
- verbose_name_plural 表示复数形式的显示;中文的单数和复数一般不作区别。
- 如果你定义了一个模型类,但是你并不想让这个模型类生成数据表,
- 仅仅是想让其他的类来继承这个类,那么你就需要定义这样一个元数据:
- abstract=True。定义完之后这个类就成了基类,不会再数据库中生成数据表。
- """
- from django.db import models
- class Ox(models.Model):
- name = models.CharField()
- class Meta: # 注意,是模型的子类,要缩进!
- abstract=True
############### 使用ORM创建表 ################
- from django.db import models
- class Author(models.Model):
- nid = models.AutoField(primary_key=True)
- name = models.CharField(max_length=32)
- age = models.IntegerField()
- # 与AuthorDetail建立一对一的关系
- authorDetail = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE)
- # models.CASCADE 删除关联数据,与之关联也删除
- class AuthorDetail(models.Model):
- nid = models.AutoField(primary_key=True)
- birthday = models.DateField()
- telephone = models.BigIntegerField()
- addr = models.CharField(max_length=64)
- # 一个作者对应一个作者详情,
- # 为什么这么做,因为作者表用的非常的频繁,每一次查的时候都要全表查,数据量大,但是用到的字段不多,
- # 所以把常用的字段抽离出来,比如列表页和详情页,这些都是需要分离的,为了更快的查询,
- class Publish(models.Model):
- nid = models.AutoField(primary_key=True)
- name = models.CharField(max_length=32)
- city = models.CharField(max_length=32)
- email = models.EmailField()
- def __str__(self):
- # 返回出版社的名称
- return self.name
- class Book(models.Model):
- nid = models.AutoField(primary_key=True)
- title = models.CharField(max_length=32)
- publishDate = models.DateField()
- price = models.DecimalField(max_digits=5, decimal_places=2)
- # 与Publish建立一对多的关系,外键字段建立在多的一方
- publish = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE)
- # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
- authors = models.ManyToManyField(to='Author', )
- def __str__(self):
- return self.title
执行命令:
- # 执行命令,这样表就创建了
- python manage.py makemigrations #把改动记录到文件中,
- python manage.py migrate #迁移
- # 在django中的ORM操作数据库表:
- # 删除数据表,注释掉整个建表的类,
- # 执行语句,这样就删除表了,
- python manage.py makemigrations
- python manage.py migrate
- # 修改字段一样,修改表字段,
- # 执行语句,
- python manage.py makemigrations
- python manage.py migrate
############### 使用ORM创建表 ################
############### 使用ORM创建表 ################
############### 使用ORM创建表 ################
django框架基础-ORM基础-长期维护的更多相关文章
- django框架基础-ORM进阶-长期维护
############### ORM进阶---contenttype ################ 设计思路: """ 路飞有两种课,专题课和学位课, ...
- django框架进阶-使用缓存-长期维护
############### django-缓存页面 ############### ########################################### # 全站缓存, ...
- django框架进阶-ModelForm组件-长期维护
############################################################ """ 通常在Django项目中,我们编写的大部 ...
- django框架进阶-form组件-长期维护
################## form组件做了什么事情? ####################### 之前web开发的模式,以注册为例 1,要有一个注册页面,然后有一个f ...
- Django框架 之 ORM查询操作详解
Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...
- Django框架05 /orm单表操作
Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...
- Django框架 之 ORM中介模型
Django框架 之 ORM中介模型 中介模型 处理类似搭配 pizza 和 topping 这样简单的多对多关系时,使用标准的ManyToManyField 就可以了.但是,有时你可能需要关联数据 ...
- Django框架 之 ORM 常用字段和参数
Django框架 之 ORM 常用字段和参数 浏览目录 常用字段 字段合集 自定义字段 字段参数 DateField和DateTimeField 关系字段 ForeignKey OneToOneFie ...
- Django框架之ORM常用字段
一.ORM介绍 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过 ...
- Django框架06 /orm多表操作
Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ...
随机推荐
- 翻译——3_Gaussian Process Regression
使用不同的机器学习方法进行预测 续上篇2_Linear Regression and Support Vector Regression 高斯过程回归 %matplotlib inline impor ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习:DOM EventListener
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Linux(CENTOS7) RabbitMq安装
RabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rab ...
- 1. laravel 学习 环境搭建
1. 项目环境 vagrant + laradock (因为 自己手动搭建环境太麻烦了 自己弄了一下 感觉还是有些漏洞 所以采用 laradock) 2. Vagrantfile 备注 : box ...
- 当初希望自己是如何投入这个专业的学习的?曾经做过什么准备,或者立下过什么FLAG吗?
学习好累,打游戏好爽 我不爱学习 认真勤勉投入学习 精心准备,刻苦学习 我的flag 作为大学生,需要了解今后职场社会,对职业方向有了进一步的认识.社会对于人才的要求在某些方面都是不谋而合的,比 ...
- MyBatis从入门到精通(第6章):MyBatis 高级查询->6.1.2高级结果映射之一对多映射
jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.IntelliJ IDEA 2019.3.1 本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一.一对多的 ...
- Proe 导出PDF Vb.net
Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSt ...
- vue-cli3解决跨域问题
在 vue.config.js里面配置 devServer: { proxy: { '/': { // search为转发路径 target: 'http://www.baidu.com', // 目 ...
- E - Rebuild UVALive - 7187 (二次函数极值问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5531 Problem Description Archaeologists find ruins of ...
- elasticsearch minhash 测试应用
上一章看了代码实现,算是搞明白了各参数的意义,现在开始测试,为方便以ik分词示例(对elasticsearch支持较好,测试操作简单) 首先建index,自定义 analysis ik分词用 ik_s ...