增加
- music.objects.create(属性1 = 值1, 属性2 = 值2,…)
- 成功:返回创建好的实体对象
- 失败:抛出异常
- 创建model实例对象,并调用save进行保存
obj = Music(属性 = 值,属性= 值) obj.属性 = 值 obj.save()
查询
数据库查询需要使用管理器对象进行
通过mymodel.objects管理器方法电泳查询方法
-
all()方法
- 用法MyModel.bojects.all()
- 作用:查询mymodel实体中所有的数据
- 等同于 select * from table
- 返回QuerySet容器对象(可以当做一个数组),内部存放mymodel实例
from bookstore.models import Book books = Book.obects.all() # <QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>, <Book: Book object (4)>, <Book: Book object (5)> ]> for book in books: print("书名:", book.title, '出版社:', book.pub)
可以在模型类中定义__str__方法,自定义QuerySet中的输出格式
例如:在Book中定义:def __str__(self): return '书名:%s,出版社:%s,价格:%s,零售价:%s' % (self.title, self.pub, self.price, self.market_price) >>> al = Book.objects.all() >>> al <QuerySet [<Book: 书名:python,出版社:清华大学出版社,价格:20.00,零售价:25.00>, <Book: 书 名:Django,出版社:清华大学出版社,价格:20.00,零售价:22.00>, <Book: 书名:JQuery,出版社:机械工业出版社,价格:90.00,零售价:85.00>, <Book: 书名:Linux,出版社:机械工业出版社,价格:80.00,零售价:65.00>, <Book: 书名:HTML5,出版社:清华大学出版社,价格:90.00,零售价:105.00>]>
-
values(‘列1’,‘列2’,…)
- 用法:mymodel.objects.values(…)
- 作用:查询部分列的数据并返回
- 等同于select 列1,列2 from xxx
- 返回值:QuerySet
返回查询结果容器,容器内存字典,每个字典代表一条数据,格式为{‘列1’:值1,‘列2’:值2}
>>> a2 = Book.objects.values('title','pub') >>> a2 <QuerySet [{'title': 'python', 'pub': '清华大学出版社'}, {'title': 'Django', 'pub': '清华大学出版社'}, {'title': 'JQuery', 'pub': '机械工业出版社'}, {'title': 'Linux', 'pub': '机械工业出版社'}, {'title': 'HTML5', 'pub': '清华大学出版社'}]>
-
values_list(‘列1’,‘列2’)
和values一样不过不同的是返回QuerySet中的是元祖不是字典>>> a3 = Book.objects.values_list('title','pub') >>> a3 <QuerySet [('python', '清华大学出版社'), ('Django', '清华大学出版社'), ('JQuery', '机械工业出版社'), ('Linux', '机械工业出版社'), ('HTML5', '清华大学出版社')]>
-
order_by()
- 用法:mymodel.objects.order_by(’-列’) #默认升序排序,前面加-是降序排序
- 作用:与all()不同,它会用SQL语句中的order by 子句对查询结果进行根据某个字段选择性的进行排序
>>> a4 = Book.objects.order_by('-price') >>> a4 <QuerySet [<Book: 书名:JQuery,出版社:机械工业出版社,价格:90.00,零售价:85.00>, <Book: 书名:HTML5,出版社:清华大学出版社,价格:90.00,零售价:105.00>, <Book: 书名:Linux,出版社:机械工业出版社,价格:80.00,零售价:65.00>, <Book: 书名:python,出版社:清华大学出版社,价格:20.00,零售价:25.00>, <Book: 书名:Django,出版社:清华大学出版社,价格:20.00,零售价:22.00>]> >>> a5 = Book.objects.values('title').order_by('-price') # 这些方法都可以用子啊QuerySet对象上,所以可以组合 >>> a5 <QuerySet [{'title': 'JQuery'}, {'title': 'HTML5'}, {'title': 'Linux'}, {'title': 'python'}, {'title': 'Django'}]> >>> print(a5.query) # 可以查看SQL语句 SELECT `book`.`title` FROM `book` ORDER BY `book`.`price` DESC
-
filter(条件)
- 用法:mymodel.objects.filter(属性1 = 值1,属性2 = 值2) #多个参数是and查询
- 作用:返回包含此条件的全部数据集
- 返回值:QuerySet容器对象,内部存放mymodel实例
-
exclude(条件)
- 作用:返回不包含此条件的全部数据集
- 语法:mymodel.objects.exclide(属性1 = 值1,属性2 = 值2) 、
-
get(条件)
- 语法:mymodel.objects.get(条件)
- 作用:返回满足条件的唯一一条数据
- 说明:该方法只能返回一条数据,查询结果不是一条数据(大于,小于都不行)则报错。
查询谓词
- __exact:等值匹配
Book.objects.filter(id__exact = 1) #更多的匹配null
- __contains : 包含指定值模糊查询
Book.objects.filter(pub__cotains = '清')
- __startswith:以xxx开始和__endswith:以xxx结束
- __gt 大于 __gte 大于等于 __lt小于 __lte小于等于
- __in查找数据是否在指定返回内 __in = []后面为数组
- __range 查找数据是否在指定区间内 age__range = (30,50)
更新
更新单个数据
- 查 - 通过get()得到要修改的实体对象
- 改 - 通过 对象.属性 的方法修改数据
- 保存 - 通过 对象.save() 保存数据
>>> b2 = Book.objects.get(id = 2)
>>> b2.price = 70
>>> b2.market_price = 75
>>> b2.save()
批量数据的更新
直接调用QuerySet的update(属性=值)实现批量修改
# 将清华大学的所有图书价格定为1
>>> books = Book.objects.filter(pub = '清华大学出版社')
>>> books
<QuerySet [<Book: 书名:python,出版社:清华大学出版社,价格:22.00,零售价:25.00>, <Book: 书名:Django,出版社:清华大学出版社,价格:70.00,零售价:75.00>, <Book: 书名:HTML5,出版社:清华大学出版社,价格:90.00,零售价:105.00>]>
>>> books.update(price = 1)
3 # 更新个数
>>> books = Book.objects.filter(pub = '清华大学出版社')
>>> books
<QuerySet [<Book: 书名:python,出版社:清华大学出版社,价格:1.00,零售价:25.00>, <Book: 书名:Django,出版社:清华大学出版社,价格:1.00,零售价:75.00>, <Book: 书名:HTML5,出版社:清华大学出版社,价格:1.00,零售价:105.00>]>
删除
单个数据
- 通过get()找到要删除的数据对象
- 调用这个数据对象的delect()方法实现删除
批量删
- 找到QuerySet数据
- 调用delect()删除