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

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