您的位置:首页 > 数据库

如何在django中使用models.py对数据库进行操作

2017-11-21 20:30 671 查看
一配置数据库

在上一篇文章中就已经提过这个问题,在这个就重新说一下吧

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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: