Python学习笔记--使用Django查询数据
1.all():查所有
用于查询所有:
# all()返回的是 QuerySet 类型数据,类似于 list,里面放的是一个个模型类的对象,可用索引下标取出模型类的对象。
def query_book(request):books = models.Book.objects.all()for book in books:print(book.title, book.price, book.publish, book.pub_date)return HttpResponse("<p>查询成功!</p>")
2.filter():查询满足条件的数据
用于查询符合条件的数据,pk参数用于根据主键进行查询
def filter_book(request):books = models.Book.objects.filter(pk=1)print(books)print("/////////////////////////////////")books = models.Book.objects.filter(publish="清华大学出版社",price=300)print(books, type(books))return HttpResponse("<p>查询成功!</p>")
3.exclude():查询不符合条件的数据
用于查询不符合条件的数据
def exclude_book(request):books = models.Book.objects.exclude(publish="清华大学出版社")print(books, type(books))return HttpResponse("<p>查询成功!</p>")
4.get():获取一个对象
用于查询符合条件的返回模型类的对象符合条件的对象只能为一个,如果符合筛选条件的对象超过了一个或者一个都没有都会抛出错误
def get_book(request):book = models.Book.objects.get(pk=5)book = models.Book.objects.get(price=1000)print(book, type(book))return HttpResponse("<p>查询成功!</p>")
5.order_by():排序
用于对查询结果进行排序,参数为排序字段名,默认为升序排序,降序为在字段前面加个负号 -
def order_book(request):books = models.Book.objects.order_by("price")print(books, type(books))books = models.Book.objects.order_by("-price")print(books, type(books))return HttpResponse("<p>查询成功!</p>")
6.reverse():对排序进行反转
用于对原排序查询结果进行反转
def reverse_book(request):# 按出版日期升序排列books_asc = models.Book.objects.all().order_by("pub_date")# 使用reverse()方法对查询结果进行反转后变为降序books = books_asc.reverse()for book in books:print(book.id,book.title, book.price, book.publish, book.pub_date)return HttpResponse("<p>查询成功!</p>")
7.count():计数
用于统计查询结果的数量
def count_book(request):count = models.Book.objects.count()books = models.Book.objects.filter(price=300).count()print(count, books)return HttpResponse("<p>查询成功!</p>")
8.first():查询第1条数据
用于返回查询结果的第一个对象,如果没有符合条件的对象则返回 None,可以用索引下标 [0] 取出模型类的对象
def first_book(request):book = models.Book.objects.first()print(book, type(book))return HttpResponse("<p>查询成功!</p>")
9.last():查询最后第1条数据
用于返回查询结果的最后一个对象,如果没有符合条件的对象则返回 None,注意:last() 方法不能用索引下标 [-1],ORM 没有逆序索引。
def last_book(request):book = models.Book.objects.last()print(book, type(book))return HttpResponse("<p>查询成功!</p>")
10.exists() :判断是否存在
用于判断查询结果是否存在,返回布尔值 True 或 False
def exists_book(request):exist = models.Book.objects.filter(price=300).exists()print(exist)return HttpResponse("<p>查询成功!</p>")
11.values() :获得查询结果的字典列表
用于返回查询结果的字典列表,字典的键为模型类的字段名,值为字段值
def values_book(request):# 查询所有的id字段和price字段的数据books = models.Book.objects.values("pk", "price")print(books[0]["price"], type(books)) # 得到的是第一条记录的price字段的数据return HttpResponse("<p>查找成功!</p>")
执行后控制台输出:
200.00 <class 'django.db.models.query.QuerySet'>
[03/Sep/2025 10:56:28] "GET /values_book/ HTTP/1.1" 200 22
12.values_list() :获得查询结果的元组列表
用于返回查询结果的元组列表,元组的元素为模型类的字段值
def values_list_book(request):# 查询所有的price字段和publish字段的数据books = models.Book.objects.values_list("price", "publish")print(books)print(books[0][0], type(books)) # 得到的是第一条记录的price字段的数据return HttpResponse("<p>查找成功!</p>")
执行后控制台输出:
<QuerySet [(Decimal('200.00'), '功夫出版社'), (Decimal('200.00'), '清华大学出版社'), (Decimal('300.00'), '清华大学出版社')]>
200.00 <class 'django.db.models.query.QuerySet'>
13.distinct():去重
用于返回查询结果的去重后的列表,一般是结合 values 或者 values_list 使用。
def distinct_book(request):# 对对象去重没有意义,因为对象本身就是唯一的,不可能重复books = models.Book.objects.distinct()print(books)# 结合 values_list 使用,查询出所有的publish字段的去重后的列表books = models.Book.objects.values_list("publish").distinct()print(books)return HttpResponse("<p>查找成功!</p>")
执行后控制台输出
<QuerySet [('功夫出版社',), ('清华大学出版社',)]>
<QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, <Book: Book object (3)>]>
第1个结果进行了去重,第2个对对象去重没有意义。
14.filter基于双下划线的模糊查询
(1)区间范围查询,包括in、gt、gte、lt、lte、range
# 使用双下划线+in进行区间查询
books = models.Book.objects.filter(price__in=[100,200])
# 查询价格大于200的数据
books = models.Book.objects.filter(price__gt=200)
# 查询价格大于等于100的数据
books = models.Book.objects.filter(price__gte=100)
# 查询价格小于等于100的数据
books = models.Book.objects.filter(price__lte=100)
# 查询价格介于100和200之间的数据,包括100和200
books = models.Book.objects.filter(price__range=[100,200])
(2)包含:__contains区分大小写,__icontains不区分大小写
books = models.Book.objects.filter(title__icontains="python")
(3)查询以特定内容开头、结尾、精准匹配:__startswoth、__endswith、__iexact
# 查询标题以python开头的数据
books = models.Book.objects.filter(title__startswith="python")
# 查询标题以python结尾的数据
books = models.Book.objects.filter(title__endswith="python")
# 查询标题精确匹配python的数据
books = models.Book.objects.filter(title__iexact="python")
(4)日期查询:__year、__month、__day
# __year 是 DateField 数据类型的年份,= 号后面为数字。
books = models.Book.objects.filter(pub_date__year=2015)
# __month 是 DateField 数据类型的月份,= 号后面为数字。
books = models.Book.objects.filter(pub_date__month=10)
# __day 是 DateField 数据类型的日,= 号后面为数字。
books = models.Book.objects.filter(pub_date__day=10)