模型参考上一章内容:
Django QuerySet对象,filter()方法-CSDN博客
查询数据可以通过以下方法:
Book.objects.all() Book.objects.filter() Book.objects.get()
1,添加视图函数
Test/app11/views.py
from django.shortcuts import render
from .models import Post
def index(request):
posts = Post.objects.all()
return render(request, '11/index.html', {'posts': posts})
# apps/books/views.py
from django.shortcuts import render
from .models import Book
def book_list_view(request):
# 使用filter()方法获取所有价格在10到20之间的书籍
# books = Book.objects.filter(price__gte=10, price__lte=20) # __gte是“greater than or equal to”(大于等于)的缩写,__lte是“less than or equal to”(小于等于)的缩写。
# books = Book.objects.filter(price__gt=10) # 在Django的ORM(对象关系映射)查询中,__gt是过滤条件的一个特殊语法,用于表示“大于”(greater than)。
books = Book.objects.filter(price__lt=29.99) # __lt 是“less than”(小于)的缩写。
return render(request, '11/book_list.html', {'books': books})
def get_book_view(request):
try:
# 使用get()方法获取标题为"Python Cookbook"的书籍
book = Book.objects.get(id=19)
# 现在book变量包含了匹配的书籍对象
print(book)
return render(request, '11/book_detail.html', {'book': book})
except Book.DoesNotExist:
# 如果没有找到匹配的书籍,返回错误信息
return HttpResponse("Book not found.")
except Book.MultipleObjectsReturned:
# 如果找到多个匹配的书籍,返回错误信息
return HttpResponse("Multiple books found with the same title.")
def book_list_view_exclude(request):
# 使用exclude()方法获取所有价格不等于10且标题不包含"Python"的书籍
books = Book.objects.exclude(price=9.99).exclude(title__icontains="Python")
return render(request, '11/book_list_exclude.html', {'books': books})
def book_list_view_values(request):
# 使用values()方法获取所有书籍的标题和作者
books_data = Book.objects.values('title', 'author')
print(books_data)
for i in books_data:
print(type(i))
# 将数据传递给模板
return render(request, '11/book_list_view_values.html', {'books_data': books_data})
def book_list_view_distinct(request):
# 使用values()和distinct()方法获取所有不同作者的书籍
books_data = Book.objects.values('author').distinct()
# 打印查询结果
print(books_data)
# 将数据传递给模板
return render(request, '11/books_distinct.html', {'books_data': books_data})
def book_list_view_select(request):
books_data = Book.objects.all()
print(type(books_data))
books_data2 = Book.objects.filter(id=19)
print(books_data2)
books_data3 = Book.objects.get(id=1)
print(books_data3)
# 将数据传递给模板
return render(request, '11/book_select.html', {'books_data': books_data, 'books_data2': books_data2, 'books_data3': books_data3})
2,添加html代码
Test/templates/11/book_select.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ books_data }}
<br/>
{{ books_data2 }}
<br/>
{{ books_data3 }}
</body>
</html>
3,添加路由地址
Test/app11/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('index/', views.index, name='index'),
path('book_list_view/', views.book_list_view, name='book_list_view'),
path('get_book_view/', views.get_book_view, name='get_book_view'),
path('book_list_view_exclude/', views.book_list_view_exclude, name='book_list_view_exclude'),
path('book_list_view_values/', views.book_list_view_values, name='book_list_view_values'),
path('book_list_view_distinct/', views.book_list_view_distinct, name='book_list_view_distinct'),
path('book_list_view_select/', views.book_list_view_select, name='book_list_view_select'),
]
4,访问页面
http://127.0.0.1:8000/app11/book_list_view_select/
5,注意点
需要注意的是,filter()和get()方法都可以查询数据,但是filter()在查询不到数据时,不会有任何提示,get()则会返回DoesNotExist