一配置数据库
在上一篇文章中就已经提过这个问题,在这个就重新说一下吧
先找到与你项目同名的目录下的__init__.py文件,在其中输入以下代码,以保证mysql数据库能够正常操作
import pymysql
pymysql.install_as_MySQLdb()
在同级目录下的seetings.py中找到DATABASES模块作以下修改
DATABASES = {
‘default’: {
# 关联的数据库类型
‘ENGINE’: ‘django.db.backends.mysql’,
# 数据库名
‘NAME’: ‘super’,
# 数据库登陆用户名
‘USER’: ‘root’,
# 数据库登陆密码
‘PASSWORD’: ‘xxxxxxx’,
# 主机名
‘HOST’: ‘localhost’,
# 端口号
‘PORT’: ‘3306’,
}
}
在应用目录下的models.py文件中,创建模型类,用以对数据库的操作,注意,此时需已创建对应的数据
二了解model模块
三定义模型
简述
模型主要就是对数据表,字段的操作
每个模型都应该对应着一张数据表,在模型中定义的属性对应着表中的一个字段
定义属性
属性的类型和约束条件都比较多,可以自行百度,我在这里就不说了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
元选项
在模型类中定义Meta类,用于设置元信息
属性:db_table 定义数据表在数据库中的名称
ordering 对象的默认排序字段,在获取对象的时候时候使用,既获取的对象会按照你设置的顺序排列 ordering = [‘id’] 为升序 ordering[’-id’]为降序
注意:排序会增加数据库的开销
# 示例
class Meta:
db_table = 'students'
ordering = ['-id']
类属性
objects:模型管理器对象,是Maneger类型的对象,用于和数据库交互
自定义模型管理器对象
class Students(models.Model):
object2 = models.Manager()
注意:在自定义模型管理器对象以后,django自带的objects模型管理对象将会失效
模型管理器Manager类的子类:
示例
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))