基本操作包括增删改查操作,即(CRUD操作)
CRUD是指在做计算处理时的增加(Create)、读取查询(Read)、更新Update)和删除(Delete)
ORM CRUD 核心-> 模型类管理器对象
每个继承自 models.Model 的模型类,都会有一个 objects 对象被同样继承下来。这个对象叫管理器对象
数据库的增删改查可以通过模型的管理器实现
class MyMode1 (models .Mode1) :
...
MyMode1.objects.create(...) # objects 是管理器对象
Django ORM 使用一种直观的方式把数据库表中的数据表示成Python 对象
创建数据中每一条记录就是创建一个数据对象
方案1
MyModel.objects.create(属性1=值1,属性2=值1,...)
成功: 返创建好的实体对象
失败: 抛出异常
方案2
创建MyModel实例对象并调用 save()进行保存
obj = MyMode1(属性=值,属性=值)
obj.属性=值
obj.save()
启动Django shell进行相应的操作(项目代码发生变化时,Django shell要重新启动)
python3 manage.py shell
all()方法
用法:MyModel.objects.all()
作用: 查询MyModel实体中所有的数据
等同于 select * from tabel
返回值: QuerySet容器对象,内部存放 MyModel 实例
可以在模型类中定义__str__ 方法,自定义QuerySet中的输出格式例如 在Book模型类下定义如下
def __str__(self):
return '%s %s %s%s'(self.title, self.price, self.pub, self.market_price)
values('列1','列2'..)
用法:MyModel.obiects.values(...)
作用:查询部分列的数据并返回
等同于 select 列1,列2 from xxx
返回值: OuerySet
返回查询结果容器,容器内存字典,每个字典代表一条数据
格式为:{'列1':'值1','列2':'值2'}
values list('列1','列2'...)
用法:MyModel.objects.values list(....)
作用:返回元组形式的查询结果
等同于 select 列1列2 from xxx
返回值: uerySet容器对象,内部存放元组
会将查询出来的数据封装到元组中,再封装到查询集合OuerySet中
order_by()
用法:MyModelobjects.order_by('-列','列')
作用:
与all()方法不同,它会用SOL 语句的ORDER BY 子句对查询结果进行根据某个字段选择性的进行排序
说明:
默认是按照升序排序,降序排序则需要在列前增加-表示
条件查询
filter(条件)
语法:MyModel.obiects.filter(属性1=值1,属性2=值2)
作用: 返回包含此 条件的全部的数据集
返回值:
QuerySet容器对象,内部存放 MyModel 实例
说明:
当多个属性在一起时为”与”关系
exclude(条件)
语法:MyModel.objects.exclude(条件)
作用: 返回不包含此 条件的全部的数据集
get(条件)
语法:MyModel.objects.get(条件)
作用: 返回满足条件的唯一一条数据
说明: 该方法只能返回一条数据
查询结果多余一条数据则抛出ModelMultipleObiectsReturned异常
查询结果如果没有数据则抛出Model.DoesNotExist异常
查询谓词
定义:做更灵活的条件查询时需要使用查询谓词
说明:每一个查询谓词是一个独立的查询功能
__exact:等值匹配
示例:
Author.objects.filter(id__exact=1)
# 等同于select * from author where id = 1
contains:包含指定值
示例: Author.objects.filter(name__contains='w')
# 等同于 select * from author where name like %w%
startswith:以XXX 开始 w%
endswith:以XXX 结束 %w
__gt:大于指定值
样例: Author.objects.filer(age__gt=50)
# 等同于 select * from author where age > 50
__gte:大于等于
__lt:小于
__lte:小于等于
__in:查找数据是否在指定范围内
样例:
Author.objects.filter(country__in=['中国',日本',韩国'])
# 等同于 select * from author where country in ('中国',日本',韩国')
__range:查找数据是否在指定的区间范围内
样例:
# 查找年龄在某一区间内的所有作者
Author.objects.filter(age__range=(35,50))
# 等同于 SELECT... WHERE Author BETWEEN 35 and 50;
更新单个数据
修改单个实体的某些字段值的步骤
1.查
通过 get()得到要修改的实体对象
2.改
通过 对象.属性的方式修改数据
3.保存
通过对象save()保存数据
批量更新数据
直接调用OuerySet的update(属性=值) 实现批量修改
示例
# 将 id大于3的所有图书价格定为0元
books = Book.objects.filter(id__gt=3)
books.update(price=0)
# 将所有书的零售价定为100元
books = Book.objects.a11()
books.update(market_price=100)
单个数据删除
步骤
1.查找查询结果对应的一个数据对象
2调用这个数据对象的delete(方法实现删除
try:
auth = Author.objects.get(id=1)
auth.deTete()
except:
print(删除失败)
批量删除
步骤
1查找查询结果集中满足条件的全部QuerySet查询集合对象
2调用查询集合对象的delete()方法实现删除
# 删除全部作者中,年龄大于65的全部信息
auths = Author.objects.filter(age__gt=65)
auths .delete()
伪删除
通常不会轻易在业务里把数据真正删掉,取而代之的是做伪删除即在表中添加一个布尔型字段(is_active),默认是True;执行删除时,将欲删除数据的is_active字段置为False
注意:用伪删除时,确保显示数据的地方,均加了is_active=True的过滤查询