Django-14 ORM 普通查询,条件查询,查询谓词 1. 普通查询 2. 条件查询 3. 查询谓词(非等值的过滤查询)

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

测试用例:

  • 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))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章