Django ORM操作
ORM简介
对象关系映射(Object Relational Mapping,简称ORM)模式,简单说就是用面向对象的思想去操作数据库。
ORM解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。
ORM提供了对数据库的映射,不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。
优点:
让软件开发人员专注于业务逻辑的处理,提高了开发效率,
有效减少出现重复SQL语句的概率。
缺点:
在一定程度上牺牲程序的性能,
复杂的需求实现有一定的困难
增删改查操作
增(creat)
删(delet)
改(update)
查
count() , 查询结果个数
Student.object.all().count()
values(),将对象的内容序列化成字典,json
Student.object.all().values()
exclude() , 将满足条件的信息过滤掉
Student.object.exclud(age=23).all()
order_by()
Student.object.all().order_by('id') #升序
Student.object.all().order_by('-id') # 降序
get()
条件必须成立且查询结果只能是一个
filter ()
查询模糊查询
# 字段__contains, 包含
Student.object.filter(s_name_conains='小').all()
# 字段__startwith, 以什开始
Student.object.filter(s_name__startwith='朱').all
# 字段__endwith, 以什么结尾
Student.object.filter(s_name_endiwth='龙').all()
# in, 在列表中
Student.object.filter(id__in=[1,3,4,5,9]).all()
# gt, 大于。 gte, 大于等于
# lt, 小于。 lte 小于等于
Student.object.filter(id__gt=10).all()
聚合查询 aggregate
Avg, Max, Min, Sum, Count,
from django.db.models import Avg,Sum
Student.object.all().aggregate(Avg())
F
我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较。如果我们要对两个字段的值做比较,那该怎么做呢❓
Django 提供 F() 来做这样的比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。
from django.db.models import F,Q
# SQL: select * from Student where yuwen > shuxue;
Student.object.filter(yuwen__gt = F('shuxue')) # 语文成绩大于数学成绩
Student.object.filter(yuwen__gt = F('shuxue')+10) # 语文成绩大于数学成绩10分
Q 且 或 非
Stundet.object.filter(s_name_contains='小',age=23).all() # 多个条件用 逗号隔开是 且 操作
Stundet.object.filter(Q(s_name_contains='小')|Q(age=23)).all() # 或
Stundet.object.filter(~Q(s_name_contains='小')).all() # 非
表关联
一对一(OneToOne)
一对多(ForeignKey)