Django-14 ORM 普通查询,条件查询,查询谓词
1. 普通查询
- 数据库的查询需要使用管理器对象进行
- 通过MyModel.objects管理器方法调用查询方法
方法 | 说明 |
---|---|
all() | 查询全部记录,返回QuerySet查询对象 |
get() | 查询符合条件的单一记录 |
filter() | 查询符合条件的多条记录 |
exclude() | 查询符合条件之外的全部记录 |
... |
-
all()
用法:MyModel.objects.all()
作用:查询MyModel实体中的所有的数据
等同于select * from table
返回值:QuerySet容器对象,内部存放MyModel实例
from bookstore.models import Book
books = Book.objects.all()
from book in books:
print('书名',book.title,'出版社',book.pub)
tips:_str_类似java的toString(),可以打印对象的时候更友好
-
values()
用法:MyModel.objects.values('列1','列2')
作用:查询部分列的数据并返回
等同于select 列1,列2 from table
返回值:QuerySet
- 返回查询结果容器,容器内存字典,每一个字典代表一条数据,格式为:{'列1':'值1','列2':'值2'}
>>> a2 = Book.objects.values('title','pub')
>>> a2
<QuerySet [{'title': 'Python', 'pub': '清华大学出版社'}, {'title': 'Django', 'pub': '清华大学出版社'}]>
-
values_list()
用法:MyModel.objects.values_list('列1','列2')
作用:返回元组形式的查询结果
等同于select 列1,列2 from table
返回值:QuerySet,容器内存'元组'
- 会将查询出来的数据封装到元组中,再封装到查询集合QuerySet中
>>> a2 = Book.objects.values_list('title','pub')
>>> a2
<QuerySet [('Python', '清华大学出版社'), ('Django', '清华大学出版社')]>
-
order_by()
用法:MyModel.objects.order_by('-列1','列2')
作用:与all()方法不同,它会用SQL语句的ORDER BY 子句对查询结果进行根据某个字段选择性的排序
说明:默认是按照升序,降序排序则需要在列前增加'-'表示
>>> a2 = Book.objects.values_list('title','pub').order_by('-price')
>>> a2
<QuerySet [('Django', '清华大学出版社'), ('Python', '清华大学出版社')]>
tips:用 querySet对象.query可以反查出SQL的语句
>>> print(a2.query)
SELECT `book`.`title`, `book`.`pub` FROM `book` ORDER BY `book`.`price` DESC
测试用例:
image.png- bookstore/templates/bookstore/all_book.html
<body>
<table border="1">
<tr>
<th>id</th>
<th>title</th>
<th>pub</th>
<th>price</th>
<th>market_price</th>
<th>op</th>
</tr>
{% for book in all_book %}
<tr>
<th>{{book.id}}</th>
<th>{{book.title}}</th>
<th>{{book.pub}}</th>
<th>{{book.price}}</th>
<th>{{book.market_price}}</th>
<th>
<a href="">更新</a>
<a href="">删除</a>
</th>
</tr>
{% endfor %}
</table>
</body>
- bookstore/views.py
def all_book(request):
all_book = Book.objects.all()
return render(request,'bookstore/all_book.html',locals())
- mysite1/urls.py
urlpatterns = [
path('bookstore/',include('bookstore.urls')),
]
- bookstore/urls.py
urlpatterns = [
path('all_book',views.all_book)
]
2. 条件查询
-
filter(条件)
语法:MyModel.objects.filter(属性1=值1,属性2=值2)
作用:返回包含此条件的全部的数据集
返回值:QuerySet容器对象,内部存放MyModel实例
说明:当多个属性在一起时为“与”关系,即当 -
exclude(条件)
语法:MyModel.objects.exclude(条件)
作用:返回不包含此条件的全部的数据集 -
get(条件)
语法:MyModel.objects.get(条件)
作用:返回满足条件的唯一一条数据
说明:该方法只能返回一条数据
查询结果多余一条 数据则抛出异常
【Model.MultipleObjectsReturned异常】
查询结果如果没有数据则抛出异常
【Model.DoesNotExist 异常】
3. 查询谓词(非等值的过滤查询)
- 定义:做更灵活的条件查询时需要使用查询谓词
- 说明:每一个查询谓词是一个独立的查询功能
-
__exact:等值匹配
示例:Author.objects.filter(id__exact=1)
-
__contains:包含指定值
示例:Author.objects.filter(name__contains='w')
-
__startswith:以xxx开始
-
__endswith:以xxx结束
-
__gt:大于指定值
-
__gte:大于等于
-
__lt:小于
-
__lte:小于等于
-
__in:查找数据是否在指定范围内
示例:Author.objects.filter(country__in=['中国','日本','韩国'])
-
__range:查找数据是否在指定的区间范围内
示例:Author.objects.filter(age__range=(35,50))