自我总结47
聚合查询
级联更新 外键字段带来的约束
例子:
书跟出版社是一对多关系 外键字段在书那儿
这个时候如果你把出版社删了 所对应的书也会自动删除
这个时候如果你把出版社主键值改变了 那么书籍表中对应的出版社主键值也会自动修改
聚合函数
关键词 aggregate
聚合函数必须用在分组之后,没有分组其实默认整体就是一组
# 导入模块
from django.db.models import Max, Min, Sum, Avg, Count
# 要跟数据库相关的功能,基本上都在django.db.models里面。如果不在,可能直接在django.db里面
Max
Min
Sum
Avg
Count
分组查询
group by
什么时候用? 关键词 ”每“ 例如:每一个部门的平均薪资
关键词 annotate
from django.db.models import Max, Min, Sum, Avg, Count
# django中models后面点什么 就按照什么分组
F和Q查询
from django.db.models import F,Q
F查询
拿到表中字段所对应的数据
例子:查询卖出数大于库存数的书籍
Q查询
能够支持修改多个查询条件的关系
and
or
not
filter只能按照and的关系查询数据
filter(Q(title=''),price=)
filter(Q(title='')|Q(title=''))
filter(Q(title='')|Q(title=''))
高级用法
# Q对象的高级用法
q = Q()
q.connector = 'or' # or关系
q.children.append(('title','xxx'))
q.children.append(('price',666.66))
filter(q) # 默认是and
orm字段及参数
字段合集
CharField
varchar
IntegerFiled
BigIntegerField
EmailField
DateField
DateTimeField
AutoField
BooleanField
TextField
FileField
DecimalField(Field)
# DateField和DateTimeField
auto_now_add 在创建数据的时候 会将当前时间自动记录 之后不会自动修改 除非你人为修改
auto_now 每次修改数据的时候 都会自动将当前修改时间更新上去 实时更新
外键字段
to_field
字段参数
null
unique
db_index
default
自定义char字段
# 自定义字段类型
class MyCharField(models.Field):
def __init__(self,max_length,*args,**kwargs):
self.max_length = max_length
# 重新调用父类的方法
super().__init__(max_length=max_length,*args,**kwargs)
def db_type(self, connection):
return 'char(%s)'%self.max_length
orm中的事务操作
事务
转账的例子
四大特性
原子性
一致性
隔离性
持久性
数据库三大范式
第一范式
1、每一列属性都是不可再分的属性值,确保每一列的原子性
2、两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据。
第二范式
每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。
第三范式
数据不能存在传递关系,即每个属性都跟主键有直接关系而不是间接关系。像:a-->b-->c 属性之间含有这样的关系,是不符合第三范式的。
比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)
这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话)
这样的表结构,我们应该拆开来,如下。
(学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)
django如何开启事务
from django.db import transaction
with transaction.atomic():
# 在缩进的代码中书写数据库操作
# 该缩进内的所有代码 都是一个事务
pass