前言
不了解ORM的同学可以先看一下这篇文章:Django中ORM的学习,可以帮助你更好的理解ORM,再来学习下面的内容。本篇文章会以“图书”为例,带你学习ORM中的增删改查操作。
我们需要准备一个简单的‘图书’数据库,然后再进行咱们的增删改查。
1.首先在modles.py中建立Book数据库,代码如下:
class Book(models.Model):
title = models.CharField('书名', max_length=50, default='',unique=True)
public = models.CharField('出版社',max_length=100,default='')
price = models.DecimalField('价格',max_digits=7, decimal_places=2)
info = models.CharField('描述',max_length=100, default='')
market_price = models.DecimalField('零售价',max_digits=7,decimal_places=2,default=0.0)
class Meta:
db_table = 'book' # 这里是将表名改为了book
# 格式化输出
def __str__(self):
return '%s_%s_%s_%s'%(self.title, self.public, self.price, self.market_price)
2.然后在views.py中定义方法,代码如下:
def all_book(request):
#all_book = Book.objects.all()
all_book = Book.objects.filter(is_active=True)
return render(request, 'bookstore/all_book.html', locals())
3.再urls.py中配置一下path路径,代码如下:
urlpatterns = [
path('all_book', views.all_book)
]
我们是在Python-Shell上实现ORM的增删改查,所以我们需要先启动Shell,并把模型导入到里面执行以下命令,如图:
ORM—创建数据
创建数据主要通过模型类.objects.create()保存,例子如下:
自己可以多创建一些数据,后面使用,这里看一下我创建好的数据:
ORM—查询操作
数据库的查询需要使用管理器对象进行,通过MyModel.objects管理器方法调用查询方法,下面我会带着大家在shell里将每个方法实现一下。
1.all()方法
用法:MyModel.objects.all()
作用:查询MyModel实体中所有的数据,等同于MySQL里的 select * from table
返回值:QuerySet容器对象
例:查询所有图书的值,如下图:
2.values('列1','列2')方法
用法:MyModel.objects.values(...)
作用:查询部分列的数据并返回,等同于select 列1,列2 from xxx
返回值:QuerySet,返回查询结果容器,容器内存的是字典,每个字典代表一条数据,格式为:{'1‘:值1,‘列2’:值2}
例:查询所有图书的书名、价格、零售价的值,如下图:
3.values_list('列1','列2')方法
用法:MyModel.objects.values_list(...)
作用:返回元组形式的查询结果,等同于select 列1,列2 from xxx
返回值:QuerySet容器,内存存放’元组‘,会将查询出来的数据封装到元组中,再封装到查询集合QuerySet中
例:查询图书的书名和出版社,如下图:
4.order_by()方法
用法:MyModel.objects.order_by('-列','列')
作用:与all()方法不同,它会用SQL语句的ORDER BY子句对查询结果进行跟据某个字段选择性排序
说明:默认是按照升序排序,降序排序则需要在列前增加'-'b表示
例:将所有图书按照价格降序进行排序,如下图:
5.条件查询filter(条件)方法
语法:MyModel.objects.filter(属性1=值1,属性2=值2)
作用:返回包含此条件的全部数据集
返回值:QuerySet容器对象
例:查询出版社是清华出版社的所有图书,如下图:
6.exclude(条件)方法
语法:MyModel.objects.exclude(条件)
作用:返回不包含此条件的全部数据集
例:查询除清华大学出版社外的所有图书
7.get(条件)方法
语法:MyModel.objects.get(条件)
作用:返回满足条件的唯一一条数据
说明:该方法只能返回一条数据,查询结果多余一条数据则抛出异常
例:查询id=2的图书
8.filter()查询谓词
为了更灵活的条件查询就会用到查询谓词,每一个查询谓词是一个独立的查询功能,
__exact:等值查询,例子:Book.objects.filter(id__exact=1)
__contains:包含指定值,例子:Book.objects.filter(public__contains='清华') #查询带有清华的出版
__startwith:以xxx开始,例子:Book.objects.filter(title__startwith='北大')
__endwith:以xxx结束,例子:Book.objects.filter(title__endwith='清华')
__gt:大于指定值,例子:Book.objects.filter(price__gt=25) # 查询价格大于25的图书
__gte:大于等于某个值
__lt:小于
__lte:小于等于
__in:查找数据是否在指定范围内,例子:Book.objects.filter(title__in=['Linxu','Python'])
__range:查找数据是否在指定的区间范围内,例子:Book.objects.filter(price__range=(20,50))
ORM—更新操作
方法一(适用于修改单条数据):
需要先查出该数据,然后再按条件修改内容,最后需要save()一下
例:将id=2的书的价格改为45
方法二(适用于批量修改数据):
直接调用QuerySet的update(属性=值)实现批量修改
例:将id大于3的所有图书价格定为0元
ORM—删除操作
方法一(单个数据删除):
步骤:1.查找查询结果对应的一个数据对象
2.调用这个数据对象的delete()方法实现删除
例:删除id=3的图书
方法二(批量删除):
利用前面学到的filter()查询条件来进行删除
总结
今天所学的这些命令是ORM在与数据库进行交互时所用到的,在Django比较重要,希望本篇文章对你有所帮助。