1增:
概念:
管理器对象:每个继承自models.Model的模型类都会有一个ojects对象,这个对象就叫管理器对象,数据库的增删改查均可通过管理对象进行操作!
一创建数据:
给表添加数据方法1:
(venv) D:\PycharmProjects\mysite3>python manage.py shell
>>> from bookstore.models import Book
>>> b1 = Book.objects.create(title='JQuery',price=90,market_price=85,pub='清华大学出版社')
给表添加数据方法2:
(venv) D:\PycharmProjects\mysite3>python manage.py shell
>>> from bookstore.models import Book
>>> b2 = Book(title='Linux',price=80,market_price=65,pub='机械工业出版社')
>>> b2.save()
2查:
通过myModel.objects管理器查询的方法如下:
方法 | 说明 |
all() | 查询全部,返回QuerySet容器对象,可以理解成类数组对象 |
get() | 查询符合条件的单一记录 |
filter() | 查询符合条件的多条记录 |
exclude() | 查询符合条件之外的全部记录 |
查询技巧:
1按需的select 字段名 form 表,方法:myModel.objects.values(...),返回值是QuerySet,例如:
(venv) D:\PycharmProjects\mysite3>python manage.py shell
>>> from bookstore.models import Book
#获取key-value字典对象
>>> a2 = Book.objects.values('title')
>>> a2
<QuerySet [{'title': 'Django'}, {'title': 'Html5'}, {'title': 'JQuery'}, {'title': 'Linux'}, {'title': 'Python'}]>
#获取value列表对象
>>> a2 = Book.objects.values_list('title',flat=True).distinct()
>>> a2
<QuerySet ['Django', 'Html5', 'JQuery', 'Linux', 'Python']>
#获取元组对象
>>> a2 = Book.objects.values_list('title').distinct()
>>> a2
<QuerySet [('Django',), ('Html5',), ('JQuery',), ('Linux',), ('Python',)]>
2排序,加负号表示倒序,例如Book.objects.order_by('-price')
3可通过.query这个方法查看django生成的sql语句,例如:
>>> a2 = Book.objects.order_by('-price')
>>> a2
<QuerySet [<Book: Book object (3)>, <Book: Book object (5)>, <Book: Book object (4)>, <Book: Book object (1)>, <Book: Book object (2)>]>
>>> print(a2.query)
SELECT `book`.`id`, `book`.`title`, `book`.`price`, `book`.`market_price`, `book`.`pub`, `book`.`info` FROM `book` ORDER BY `book`.`price` DESC
>>> a2 = Book.objects.order_by('-price').values('title')
>>> a2
<QuerySet [{'title': 'JQuery'}, {'title': 'Html5'}, {'title': 'Linux'}, {'title': 'Python'}, {'title': 'Django'}]>
>>> print(a2.query)
SELECT `book`.`title` FROM `book` ORDER BY `book`.`price` DESC
>>>
示例练习:
从数据库中查出全部图书并渲染前端页面
1先创建前端页面
首先在应用bookstore里床架一个templates文件夹,然后在templates文件夹里再创建一个和应用名同名的文件夹bookstore,最后在这个bookstore文件夹内创建模板文件all_book.html,结构如下所示:
mysite3 D:\PycharmProject\mysite3
bookstore #应用
templates #模板
bookstore #与应用同名的文件夹
all_book.html #静态页面
2编写视图
from .models import *
def all_book(request):
data_book = Book.objects.all()
return render(request, 'bookstore/all_book.html', locals())
3配置主路由:
urlpatterns = [
path('bookstore/',include('bookstore.urls'))
]
4配置子路由:
from django.urls import path
from . import views
urlpatterns = [
path('all_book',views.all_book),
]
5编写前端页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1" cellspacing=0 >
<tr bgcolor="#d3d3d3">
<th>id</th>
<th>title</th>
<th>pub</th>
<th>price</th>
<th>market_price</th>
<th>op</th>
</tr>
{% for book in data_book %}
<tr>
<td>{{ book.id }}</td>
<td>{{ book.title }}</td>
<td>{{ book.pub }}</td>
<td>{{ book.price }}</td>
<td>{{ book.market_price }}</td>
<td>
<span>更新</span>
<span>删除</span>
</td>
</tr>
{% endfor %}
</table>
</body>
</html>
6浏览访问:
http://127.0.0.1:8000/bookstore/all_book
id title pub price market_price op
1 Python 清华大写出版社 0.00 25.00 更新 删除
2 Django 清华大学出版社 0.00 75.00 更新 删除
3 JQuery 清华大学出版社 90.00 85.00 更新 删除
4 Linux 机械工业出版社 80.00 65.00 更新 删除
5 Html5 机械工业出版社 90.00 105.00 更新 删除
----------------------
1等值条件查询:
多条件时,条件之间是and关系例子:
我要查名字叫张三并且年龄是28的所有人:
authors = Authors.objects.filter(name='张三',age=28)
查清华大学出版社并且定价等于50以外的全部图书:
Book.objects.exclude(pun='清华大学出版社',price=50)
注意事项:
objects.get()只能查一条数据,如果结果多余一条或者没有查到苏剧都会抛异常,因此业务编程中要使用此句一定要使用try语句减少报错
#查到很多结果
bookstore.models.Book.MultipleObjectsReturned: get() returned more than one Book -- it returned 2!
#没查到结果
raise self.model.DoesNotExist(
bookstore.models.Book.DoesNotExist: Book matching query does not
2非等值条件查询:
如果做更灵活的条件查询时,需要使用谓词
_ _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:以什么什么开始
_ _endswith:以什么什么结束
_ _gt:大于指定值
Book.objects.filter(id__gt=3)
#等同于select * from book where id > 3;
_ _gte:大于等于
_ _lt:小于
_ _lte:小于等于
Author.objects.filter(age__gt=50)
#等同于select * from author where age > 50
_ _in:查找数据是否在指定范围
Author.objects.filter(country__in=['中国','日本','韩国'])
#等同于select * from author where country in ('中国','日本','韩国')
_ _range:查找数据是否在指定的区间范围内:
Author.objects,filter(age__range=(35,50))
#等同于select * from biao where Author between 35 and 50;
查询谓词文档:
https://docs.djangoproject.com/zh-hans/3.2/ref/models/querysets/#field-lookups