如何在django中使用models.py对数据库进行操作
2017-11-21 20:30
671 查看
一配置数据库
在上一篇文章中就已经提过这个问题,在这个就重新说一下吧
1. 先找到与你项目同名的目录下的init.py文件,在其中输入以下代码,以保证mysql数据库能够正常操作
1. 在同级目录下的seetings.py中找到DATABASES模块作以下修改
在应用目录下的models.py文件中,创建模型类,用以对数据库的操作,注意,此时需已创建对应的数据
二了解model模块
概述
django对数据库提供了很友好的支持
django为这些数据库提供了统一的API,我们可以根据不同的业务需求来选择数据库
ORM简介
ORM :对象-关系-映射
功能:根据我们在models.py 中创建的模型类生成表结构
将对象,列表的操作转换成对应的sql语句
将sql语句查询到的结果转换成对象或者是列表
优点:
极大的减轻了开发人员的负担,不需要面对因数据库的改变该导致的代码重构
三定义模型
1. 简述
模型主要就是对数据表,字段的操作
每个模型都应该对应着一张数据表,在模型中定义的属性对应着表中的一个字段
2. 定义属性
属性的类型和约束条件都比较多,可以自行百度,我在这里就不说了3. 创建模型类
1. 元选项
在模型类中定义Meta类,用于设置元信息
属性:db_table 定义数据表在数据库中的名称
ordering 对象的默认排序字段,在获取对象的时候时候使用,既获取的对象会按照你设置的顺序排列 ordering = [‘id’] 为升序 ordering[‘-id’]为降序
注意:排序会增加数据库的开销
# 示例
1. 类属性
objects:模型管理器对象,是Maneger类型的对象,用于和数据库交互
3. 示例
6.创建模型对象
当创建对象时,Django不会对数据库进行读写操作,调用save()方法后才能与数据进行交互,将对象保存到数据库中
注意:在model中init方法已经在models.Model中使用,在自定义模型中无法使用
方法一:
在模型中添加一个类方法
方法二:
从Manager子类中添加
四,查询集
1. 简介
查询集:表示从数据库中获取的对象的集合
可以包含零个,一个或多个过滤器
过滤器:基于所给的参数限制查询集的结果
从sql角度来看,查询集合与select语句等价,过滤器就像where和limit子句
2. 查询集
在管理器上调用过滤器方法会返回查询集
查询集经过过滤器筛选后会返回新的查询集,一般会写成链式语法结构
惰性执行,创建查询集不会带来任何数据库的访问,直到调用数据时才会访问数据库
何时对查询集求职?迭代,序列化,与if合用
返回查询集的方法称为过滤器
all() # 得到查询集
filter() # 保留符合条件的数据 可以用链式,也可以在括号内用逗号分隔写多个条件
exclude() # 去掉符合用户自定义条件的数据,与上一个 语意相反
oder_by() # 对查询集进行排序
values() # 返回结果为:列表内包含字典,字典内包含对象的结构
# 返回单个值
get() # 注意:未找到数据会引发 “模型类.DoesNotExists”异常,存在多个会引发”模型.MultipleObjectReturned”异常
count() # 会统计当前查询到的数据的总条数
first() # 返回当前查询集中的第一个对象
last() # 返回当前查询集中的最后一个对象
exists() # 判断查询集中是否存在数据,如果存在则为True
# 限制查询集
# 由于查询集是一个列表,所以可以通过类似列表切片的方法截取其中数据,类似于sql语句中的
# offset子句和limit子句
students = Students.object3.all()[0: 5]
# 注意 索引不支持负数
3. 查询集的缓存
概述: 每个查询集都包含一个缓存来最小化对数据库的访问
在新建的查询集中,缓存为空,每次对查询集求值时,会发生数据的查询,django会将查询的结果存入缓存中
两个查询集无法重用缓存,每次查询都会与数据库发生一次交互,增加了数据库的压力
4.字段查询
实现where子句,作为filter() exclude() get()的参数
语法 属性名称__比较运算符 = 值 注意,这里是两个下划线
对于外键,使用属性_id表示外键的原始值
5. 比较运算符
exact判断相等,大小写敏感
contains 是否包含,大小写敏感
在上面四个属性前加上i即不区分大小写
isnull 是否为空 值为布尔值
gt大于,gte大于等于,lt小, lte小于等于
快捷方式,
Students.object3.filter(pk__gt=5)
跨关联关系
处理join查询,即两个表存在一定关联,或内关联,左关联,右关联,或者显式关联
查询带有下面名字人所在的班级
grade = Grades.objects.filter(students__scontend__contains = ‘薛延美’)
6.聚合函数
使用aggregate()函数返回的值
函数 Avg ,Count,Max,Min,Sum
from django.db.models import Max, Count, Max, Min, Sum
Students.object3.filter(Max(‘id’))
7.F对象
可以使用模型的字段A与字段B进行比较,如果字段A写在了等号左侧,B出现在等号右侧,
此时需要对B字段构成F对象
找到所有男同学数量大于女同学数量的班级
from django.db.models import F
grade = Grades.objects.filter(gboynum__gt=F(‘ggirlnum’))
支持F对象使用数学运算
grade = Grades.objects.filter(gboynum__gt=F(‘ggirlnum’)*2)
关联查询
grade2 = Grades.objects.filter(isDelete=F(‘students__isDelete’))
8.Q对象
概述:需要进行or查询时,使用Q对象
Q对象可以使用&和|组合起来
或
students = students.object3.filter(Q(sage__gt=50) | Q(sage = 30))
与
students = students.object3.filter(Q(sage__gt=50) & Q(sgender = True))
非
students = students.object3.filter(~Q(sage__gt=50))
在上一篇文章中就已经提过这个问题,在这个就重新说一下吧
1. 先找到与你项目同名的目录下的init.py文件,在其中输入以下代码,以保证mysql数据库能够正常操作
import pymysql pymysql.install_as_MySQLdb()
1. 在同级目录下的seetings.py中找到DATABASES模块作以下修改
DATABASES = { 'default': { # 关联的数据库类型 'ENGINE': 'django.db.backends.mysql', # 数据库名 'NAME': 'super', # 数据库登陆用户名 'USER': 'root', # 数据库登陆密码 'PASSWORD': 'Xjt199644', # 主机名 'HOST': 'localhost', # 端口号 'PORT': '3306', } }
在应用目录下的models.py文件中,创建模型类,用以对数据库的操作,注意,此时需已创建对应的数据
二了解model模块
概述
django对数据库提供了很友好的支持
django为这些数据库提供了统一的API,我们可以根据不同的业务需求来选择数据库
ORM简介
ORM :对象-关系-映射
功能:根据我们在models.py 中创建的模型类生成表结构
将对象,列表的操作转换成对应的sql语句
将sql语句查询到的结果转换成对象或者是列表
优点:
极大的减轻了开发人员的负担,不需要面对因数据库的改变该导致的代码重构
三定义模型
1. 简述
模型主要就是对数据表,字段的操作
每个模型都应该对应着一张数据表,在模型中定义的属性对应着表中的一个字段
2. 定义属性
属性的类型和约束条件都比较多,可以自行百度,我在这里就不说了3. 创建模型类
# 班级类 class Grades(models.Model): gname = models.CharField(max_length=10) gdate = models.DateTimeField() gboynum = models.IntegerField() ggirlnum = models.IntegerField() isDelete = models.BooleanField() # 当实例化这个类后会默认返回这个值,可打印 def __str__(self): return self.gname # 学生类 class Students(models.Model): sname = models.CharField(max_length=20) sage = models.IntegerField() sgender = models.BooleanField() scontend = models.CharField(max_length=40) isDelete = models.BooleanField() # 外键 sgrade = models.ForeignKey('Grades') lastTime = models.DateField() createTime = models.DateField() def __str__(self): return self.sname 在cmd中找到你的项目目录通过以下命令生成迁移文件并迁移即可 python manage.py makemigrations python manage.py migrate
1. 元选项
在模型类中定义Meta类,用于设置元信息
属性:db_table 定义数据表在数据库中的名称
ordering 对象的默认排序字段,在获取对象的时候时候使用,既获取的对象会按照你设置的顺序排列 ordering = [‘id’] 为升序 ordering[‘-id’]为降序
注意:排序会增加数据库的开销
# 示例
class Meta: db_table = 'students' ordering = ['-id']
1. 类属性
objects:模型管理器对象,是Maneger类型的对象,用于和数据库交互
自定义模型管理器对象 class Students(models.Model): object2 = models.Manager() 注意:在自定义模型管理器对象以后,django自带的objects模型管理对象将会失效 模型管理器Manager类的子类: 1. 管理器是django模型与数据库进行交互的接口,django的每个模型都应该至少拥有一个管理器对象 2. 作用:修改管理器返回的结果集,重写get_queryset()方法 向管理器中添加额外的方法
3. 示例
class StudentsManager(models.Manager): def get_queryset(self): return super(StudentsManager, self).get_queryset().filter(isDelete=False) class Students(model.Model): object2 = model.Manager() object3 = StudentManager()
6.创建模型对象
当创建对象时,Django不会对数据库进行读写操作,调用save()方法后才能与数据进行交互,将对象保存到数据库中
注意:在model中init方法已经在models.Model中使用,在自定义模型中无法使用
方法一:
在模型中添加一个类方法
@classmethod def create(cls, name, age, gender, contend grade, lTime, cTime): obj = cls(sname=name, sage=age, sgender=gender, scontend=contend, sgrade=grade, lastTime=lTime, createTime=cTime) obj.isDelete = False return obj # 视图中如下: def student(request): grade = Grades.objects.get(pk=2) stu = Students.create("张",23,False,u'我叫张', grade, date(year=2015,month=11, day=3),date(year=2015,month=11, day=3)) stu.save()
方法二:
从Manager子类中添加
def create(self, name, age, gender, contend grade, lTime, cTime): obj = self.model() obj.sname = name obj.sage = age obj.sgender = gender obj.scontend = contend obj.sgrade = sgrade obj.lastTime = lTime obj.createTime = cTime obj.isDelete = False return obj # 视图中如下 def student(request): grade = Grades.objects.get(pk=2) stu = Students.object3.create("张",23,False,u'我叫张', grade, date(year=2015,month=11, day=3),date(year=2015,month=11, day=3)) stu.save()
四,查询集
1. 简介
查询集:表示从数据库中获取的对象的集合
可以包含零个,一个或多个过滤器
过滤器:基于所给的参数限制查询集的结果
从sql角度来看,查询集合与select语句等价,过滤器就像where和limit子句
2. 查询集
在管理器上调用过滤器方法会返回查询集
查询集经过过滤器筛选后会返回新的查询集,一般会写成链式语法结构
惰性执行,创建查询集不会带来任何数据库的访问,直到调用数据时才会访问数据库
何时对查询集求职?迭代,序列化,与if合用
返回查询集的方法称为过滤器
all() # 得到查询集
filter() # 保留符合条件的数据 可以用链式,也可以在括号内用逗号分隔写多个条件
exclude() # 去掉符合用户自定义条件的数据,与上一个 语意相反
oder_by() # 对查询集进行排序
values() # 返回结果为:列表内包含字典,字典内包含对象的结构
# 返回单个值
get() # 注意:未找到数据会引发 “模型类.DoesNotExists”异常,存在多个会引发”模型.MultipleObjectReturned”异常
count() # 会统计当前查询到的数据的总条数
first() # 返回当前查询集中的第一个对象
last() # 返回当前查询集中的最后一个对象
exists() # 判断查询集中是否存在数据,如果存在则为True
# 限制查询集
# 由于查询集是一个列表,所以可以通过类似列表切片的方法截取其中数据,类似于sql语句中的
# offset子句和limit子句
students = Students.object3.all()[0: 5]
# 注意 索引不支持负数
3. 查询集的缓存
概述: 每个查询集都包含一个缓存来最小化对数据库的访问
在新建的查询集中,缓存为空,每次对查询集求值时,会发生数据的查询,django会将查询的结果存入缓存中
两个查询集无法重用缓存,每次查询都会与数据库发生一次交互,增加了数据库的压力
4.字段查询
实现where子句,作为filter() exclude() get()的参数
语法 属性名称__比较运算符 = 值 注意,这里是两个下划线
对于外键,使用属性_id表示外键的原始值
5. 比较运算符
exact判断相等,大小写敏感
contains 是否包含,大小写敏感
Students.object3.filter(sname__contains='亦菲') startwith,endwith 以什么开头,以什么结尾 students.object3.filter(sname__startwith='张')
在上面四个属性前加上i即不区分大小写
isnull 是否为空 值为布尔值
gt大于,gte大于等于,lt小, lte小于等于
快捷方式,
Students.object3.filter(pk__gt=5)
跨关联关系
处理join查询,即两个表存在一定关联,或内关联,左关联,右关联,或者显式关联
查询带有下面名字人所在的班级
grade = Grades.objects.filter(students__scontend__contains = ‘薛延美’)
6.聚合函数
使用aggregate()函数返回的值
函数 Avg ,Count,Max,Min,Sum
from django.db.models import Max, Count, Max, Min, Sum
Students.object3.filter(Max(‘id’))
7.F对象
可以使用模型的字段A与字段B进行比较,如果字段A写在了等号左侧,B出现在等号右侧,
此时需要对B字段构成F对象
找到所有男同学数量大于女同学数量的班级
from django.db.models import F
grade = Grades.objects.filter(gboynum__gt=F(‘ggirlnum’))
支持F对象使用数学运算
grade = Grades.objects.filter(gboynum__gt=F(‘ggirlnum’)*2)
关联查询
grade2 = Grades.objects.filter(isDelete=F(‘students__isDelete’))
8.Q对象
概述:需要进行or查询时,使用Q对象
Q对象可以使用&和|组合起来
或
students = students.object3.filter(Q(sage__gt=50) | Q(sage = 30))
与
students = students.object3.filter(Q(sage__gt=50) & Q(sgender = True))
非
students = students.object3.filter(~Q(sage__gt=50))
相关文章推荐
- 如何使用ANT自动进行数据库的相关操作
- django中使用数据库源语进行操作返回rawquerset的处理
- 如何使用Ado.net对数据库进行增删改操作
- 如何使用ANT自动进行数据库的相关操作
- 第三百零八节,Django框架,models.py模块,数据库操作——链表结构,一对多、一对一、多对多
- 如何使用ANT自动进行数据库的相关操作
- 如何使用ANT自动进行数据库的相关操作
- 如何使用R语言链接数据库并对数据库中的表进行查询操作
- 第三百零七节,Django框架,models.py模块,数据库操作——表类容的增删改查
- 如何使用JDOM对XML文件进行操作
- [How To]如何使用Wildfish进行ISeries开发---多操作篇
- VC中使用ADO进行数据库操作
- 浅谈如何使用ADO.NET操作数据库
- JAVA中如何用TRANSACTION来对数据库进行一系列的操作
- 如何对SQL Server数据表和数据库进行迭代操作
- 如何使用MFC进行数据库查询
- 如何使用ArcIMS在MS SQLSERVER的ArcSDE中进行跨不同数据库的关联?-转载自ESRI中国在线支持中心
- 使用Struts的Action来通过Hibernate对数据库进行增、删、改、查四项操作
- [How To]如何使用Wildfish进行ISeries项目开发--数据库建立部分
- 如何恢复一个非用户sa创建的数据库,且使用原用户创建者进行访问