Django模型
分类
一对多
对象.模型类小写_set
grade.students_set
多对多
子主题 1
一对一
模型成员
类属性
objects
manager类型的一个对象 , 与数据库交互
未指定管理器时,默认为objects 为管理器
自定义管理器
作用; 向管理器类中添加额外的方法
修改管理器返回的集合 重写 set..queryset() 方法
Django 模型与数据库 交互的接口
adminobjects = models.Manager()
class StudentsManager(models.Manager):
def get_queryset(self):
return super(StudentsManager,self).get_queryset().filter(isdelete = False)
class Students(models.Model):
stuObj1 = models.Manager()
stuObj2 = StudentsManager()
创建对象
向数据库添加数据
创建对象时,不会对数据库进行读写操作, 当调用 save()时才与数据库进行交互 , 将对象保存到数据库表中
__init__ 方法在父类 models.Model 中使用,在自定义的模型中无法使用
方法
在模型类中增加一个类方法
子主题 1
在自定义管理器中添加一个方法
模型查询
查询集
从数据库获取对象的集合
查询集可以有多个过滤器
过滤器是一个函数,基于给于的参数限制查询集结果
查询集与sql 的 select 等价 过滤器与 where 条件等价
详解
在管理器上调用 过滤方法返回查询集
查询集通过过滤器筛选后返回新的查询集,可以写成链式调用
惰性执行 创建查询集不会有任何数据访问 调用数据时才会访问数据
直接访问数据
迭代
序列化
与if 合用
返回查询集的方法为过滤器
all()
filter()
filter(键 = 值,键 = 值)
filter(键 = 值).filter(键 = 值)
exclude()
过滤符合条件的数据
order_by()
排序
values()
一条数据就是一个对象(字典); 返回一个列表
get()
返回一个满足条件的对象
如果未找到符合条件的对象,模型类报异常
如果返回多个对象 也会报模型异常
count()
查询集中的对象个数
first()
查询集中的第一个对象
last()
查询集中的最后 一个对象
exists()
判断查询集中是否有数据
限制查询集
可以使用下标的方法限制
下标不能为负数
Students.stuObj2.all()[0:5]
查询集的缓存
每个查询集都包含一个缓存,对数据库进行最小化的访问
新建的查询,缓存首次为空,第一次对查询集求值,会发生数据缓存 , django会将查询的数据做一个缓存,以后直接使用缓存
字段查询
where 语句
语法 属性名称__运算符 = 值 (两个下划线)
外键属性名_id
转义类似 like 语句
比较运算符
exact
判断
filter(isdelete = False)
contains
是否包含
studentslist = Students.stuObj1.filter(sname__contains = 'yang')
startswithendswith
以values 开关,结尾
studentslist = Students.stuObj1.filter(sname__startswith = 'yang')
以上四种检索在最前面 加上 i 不区分大小写 iexact icontains ....
isnull isnotnull
是否为空
filter(sname__isnull = False)
in
是否包含在范围内
studentslist = Students.stuObj1.filter(pk__in = [1,2,3,4,5])
大于
gt大于
gte大于等于
studentslist = Students.stuObj1.filter(sage__gt = 30)
小于
lt
lte
year
month
day
week_day
hour
minute
second
studentslist = Students.stuObj1.filter(lastTime__year = 2017)
跨关联
处理 join 查询
语法
模型类名__属性名__比较运算符
查询快捷
PK (ID)字段
主键
聚合函数
aggregate()函数 返回聚合函数的值
Maxage = Students.stuObj1.aggregate(Max('age'))
Avg
Count
Max
Min
Sum
F对象
A属性与B属性之间的比较
支持 算数运算
Q对象
过滤器的方法中的关键字参数,条件为and 模式
进行 or 查询
studentslist = Students.stuObj1.filter(Q(pk__lte = 3) | Q(sage__gt = 50))
studentslist = Students.stuObj1.filter(~Q(pk__lte = 3))取反值
领取专属 10元无门槛券
私享最新 技术干货