模型
概述
Django对各种数据库提供了很友好的支持,统一的调用API,我们可以根据自己不同的业务需求选择不同的数据库。
配置数据库
__init__.py
import pymysql
pymysql.install_as_MySQLdb()
settings.py
# 修改DATABASES
{
'default':{
'ENGINE':'django.db.backends.mysql',
'NAME':'数据库名',
'USER':'数据库用户名',
'PASSWORD':'数据库密码',
'HOST':'localhost或者IP',
'PORT':'3306'
}
}
ORM简介
概述
对象 - 关系 - 映射
功能
- 根据类生成表结构
- 将对象、列表的操作转换为sql语句
- 将sql查询到的结果转为对象、列表
优点
极大的减轻了开发人员的工作量,不需要面对因数据库的改变而导致代码不能使用
定义模型
模型、属性、表、字段之间的关系
一个模型在数据库中对应一张表,在模型中定义的属性,对应该模型对照表中的一个字段
创建模型类
班级类
class Grades(models.Model):
gname = models.CharField(max_length=10)
gdate = models.DateTimeField()
gboynum = models.IntegerField()
ggirlnum = models.IntegerField()
isDelete = models.BooleanField()
# 重写 __str__() 方法
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(auto_now=True)
createTime = models.DateField(auto_now_add=True)
def __str__(self):
return self.sname
元选项
在模型类中定义Meta类,用于设置元信息
属性
db_table 定义数据表名称
ordering 对象的默认排序字段,获取对象的列表时使用
示例:
ordering = ['id'] 升序
ordering = ['-id'] 降序
注意:
排序会增加数据库的开销
示例
class Meta:
db_table = 'students'
ordering = ['-id']
类属性
objects
叫做模型管理对象,是Manage类型的对象,用于与数据库进行交互
自定义模型管理对象
class Students(models.Model):
object2 = models.Manage()
注意:
为当前类指定模型管理器对象后,django不再为模型生成名为objects的默认模型管理器
模型管理器Manage类的子类
管理器是Django的模型进行数据库查询操作的窗口,Django应用的每个模型都至少拥有一个管理器对象
作用
- 修改管理器返回的原始查询集——>重写get_queryset()方法
- 向管理器中添加额外的方法
示例
class StudentManager(models.Manager):
def get_queryset(self):
return super(StudentsManager, self).get_queryset().filter(isDelete=False)
class Students(models.MOdel):
object2 = models.Manager()
objects3 = models.Manager()
创建模型对象
当创建对象时,Django不会对数据库进行读写操作,调用save()方法才会与数据库进行交互,将数据保存到数据库中
注意:
__init__方法已经在基类models.Model中使用,在自定义模型中无法使用
方法
在模型中增加一个类方法
class StudentsManager(models.Manager):
def get_queryset(self):
return super(StudentsManager, self).get_queryset().filter(isDelete=False)
class Students(models.Model):
object2 = models.Manager()
object3 = StudentsManager()
def __str__(self):
return self.sname
class Mate:
db_table = 'students'
ordering = ['id']
#类方法
@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
grade = Grades.objects.get(pk=1)
stu = Students.create('张柏芝', 23, False, u'我叫张柏芝', grade, date(year=2017,month=10,day=23), date(year=2017,month=3,day=12))
stu.save()
模型查询
简介
查询集:
表示从数据库中获取的对象的集合,可以包含有零个、一个或多个过滤器
过滤器:
基于所给的参数限制查询集的结果
从SQL角度来看,查询集合select语句等价,过滤器就像where和limit子句
查询集
在管理器上调用过滤器方法会返回查询集,查询集经过过滤器筛选后返回新的查询集,所以写成链式语法结构
惰性执行:创建查询集不会带来任何数据库的访问,直到调用数据时才会访问数据库
何时对查询求值?:迭代、序列化、与 if 合用
返回查询集的方法称为过滤器:
- all() 得到查询集
- filter() 保留符合条件的数据
filter(键1=值1,键2=值2) —> students = Students.object3.filter(sage=20,sgender=True)
filter(键1=值1).filter(键2=值2) —> students = Students.object3.filter(sage=20).filter(sgender=True) - exclude() 去掉符合条件的数据
- order_by() 对查询排序
- values() 一个对象构成一个字典,然后构成一个列表返回
返回多个值的方法:
get() 返回满足条件的对象,student = Students.object3.get(pk=1)
注意: 如果未找到会引发 模型类.DoesNotExist 异常:student = Students.object3.get(sage=2000) 如果有多条被返回,会触发 模型类.MultipleObjectsReturned 异常:students = Students.object3.get(age=20)
count() 返回当前查询总条数, Students.object3.all().count()
- first() 返回第一个对象, Students.object3.all().first()
- last 返回最后一个对象
- exists() 判断查询集中是否有数据,如果有则返回True
限制查询集:
查询返回列表,可以用下标的方式进行限制,等同于sql中的limit子句和offset子句
students = Students.object3.all()[5 : 10]
注意:
索引不支持负数
查询集的缓存:
概述:每个查询集都包含一个缓存来最小化对数据库的访问,在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据的查询,Django会将查询到的结果存储到缓存,并返回请求的结果,接下来的对查询集将重用缓存的结果,两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互增加了数据库的压力
字段查询
概述
实现where子句,作为filter(), get()的参数
语法
属性名称__比较运算符 = 值
注意:
两个下划线
对于外键
使用 属性_id 表示外键的原始值
转义
\
比较运算符
exact
表示判断相等,大小写敏感
contains
是否包含,大小写敏感 Students.object3.filter(sname__contains=’亦菲’)
startswith、endswith
以…开头或结尾,大小写敏感 Students.object3.filter(sname__startwith=’刘’)
扩展(不区分大小写)
iexact icontains istartswith iendswith
isnull
是否为null,值为布尔类型
gt gte lt lte
大于 大于等于 小于 小于等于
Students.object3.filter(sage__gt=20)
year month day week_day hour minute second
对日期类型的属性进行运算
快捷方式
pk 表示primary key,默认的主键是 id
Students.object3.filter(pk__gt=5)
跨关联关系的查询,处理join查询
语法
模型类名小写[属性名][比较]
注意:
可以没有[比较]部分,表示等于,结果等同于inner join
可返回使用,即在关联的两个模型中都可以i使用
需求
带有“薛延美”这三个字的数据在哪个班级
grade = Grades.objects.filter(students__scontend__contains=’薛延美’)
聚合函数
使用aggregate()函数返回聚合函数的值
函数:Avg, Count, Max, Min, Sum
示例:from django.db.models import Max, Min, Sum
Students.object3.aggregate(Sum('sage'))
F对象
可以使用模型的字段A与字段B进行比较,如果字段A写在了等号左侧,B出现在等号右侧,此时需要对B字段构建F对象
需求
找到所有男学生数大于女学生数的班级:
from django.db.models import F
grades = Grades.object.filter(gboynum__gt=F('ggirlnum'))
支持F对象使用数学运算:
grades = Grades.object.filter(gboynum__gt=F('ggirlnum') * 2)
关联查询:
grades2 = Grades.objects.filter(isDelete=F('students_isDelete'))
对于date、time字段,可以与datetime()进行运算
Q对象
需要进行 or 查询时,使用Q对象
Q对象可以使用&(and)和 | (or)组合
from django.db.models import Q
或:students = Students.object3.filter(Q(sage__gt=50) | Q(sage=30))
与:students = Students.object3.filter(Q(sage=20) & Q(sgender=True)) == students = Students.object3.filter(sage=20).filter(agender=True)
非:students = Students.object3.filter(~Q(age=20))