一、简单查询
<1> all(): 查询所有结果,结果是queryset类型
all_obj = models.BookInfo.objects.all()
print(all_obj)
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象,结果也是queryset类型
filter_obj = models.BookInfo.objects.filter(id=4, book_title='888')
print(filter_obj)
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,是.model的自定义类对象,返回结果有且只有一个。如果符合筛选条件的对象超过一个或者没有都会抛出错误,捕获异常try。
get_obj = models.BookInfo.objects.get(id=4)
print(get_obj)
print(get_obj.book_title)
<4> exclude(**kwargs): 排除的意思,返回值是queryset的类型
<5> order_by(*field): queryset类型的数据来调用,对查询结果排序,默认是按照id来升序排列的,返回值还是queryset类型。
order_ibj = models.BookInfo.objects.all().order_by()
for ele in order_ibj:
print(ele.id)
#直接写price,默认是按照book_price升序排列,按照字段降序排列,就写个负号就行了order_by('-book_price'),order_by('book_price','id')是多条件排序,按price进行升序,price相同的数据,按照id进行升序
order_ibj1 = models.BookInfo.objects.all().order_by('book_price')
for ele in order_ibj1:
print(ele.book_price)
<6> reverse(): queryset类型的数据来调用,对查询结果反向排序,返回值还是queryset类型。
<7> count(): queryset类型的数据来调用,返回数据库中匹配查询(QuerySet)的对象数量。
all_obj = models.BookInfo.objects.all()
print(all_obj)
print(all_obj.count())
<8> first(): queryset类型的数据来调用,返回第一条记录 Book.objects.all()[0] = Book.objects.all().first(),得到的都是model对象。
all_obj = models.BookInfo.objects.all()
print(all_obj.first().id)
<9> last(): queryset类型的数据来调用,返回最后一条记录,得到的都是model对象。
all_obj = models.BookInfo.objects.all()
print(all_obj.last().id)
<10> exists(): queryset类型的数据来调用,如果QuerySet包含数据,就返回True,否则返回False。(空的queryset类型数据也有布尔值True和False,但是一般不用它来判断数据库里面是不是有数据,如果有大量的数据,你用它来判断,那么就需要查询出所有的数据,效率太差了,用count或者exits),例:all_books = models.Book.objects.all().exists() #翻译成的sql是SELECT (1) AS a
FROM app01_book
LIMIT 1,就是通过limit 1,取一条来看看是不是有数据
<11> values(field): queryset类型的数据来调用,返回一个特殊的QuerySet(ValueQuerySet),即是一个可迭代的字典序列
sele_obj = models.BookInfo.objects.all().values('book_title')
print(sele_obj)
<12> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
sele_obj1 = models.BookInfo.objects.all().values_list('book_title')
print(sele_obj1)
<13> distinct(): values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录
sele_obj3 = models.BookInfo.objects.all().values('book_title').distinct()
print(sele_obj3)
以上只要是返回的queryset类型,就可以继续链式调用queryset类型的其他的查找方法
二、基于双下划线的模糊查询
#price值等于这三个里面的任意一个的对象
models.BookInfo.objects.filter(book_price__in=[100,200,300])
#大于,大于等于是book_price__gte=100,别写book_price>100,这种参数不支持
models.BookInfo.objects.filter(book_price__gt=100)
models.BookInfo.objects.filter(book_price__lt=100)
#sql的between and,大于等于100,小于等于200
models.BookInfo.objects.filter(book_price__range=[100,200])
#title值中包含python的,区分大小写
models.BookInfo.objects.filter(book_title__contains="python")
#title值中包含python的,不区分大小写
models.BookInfo.objects.filter(book_title__icontains="python")
#以py开头,不区分大小写
models.BookInfo.objects.filter(book_title__startswith="py")
#pub_date的年份为2003的
sele_obj4 = models.BookInfo.objects.filter(pub_date__year=2003)
print(sele_obj4[0].pub_date)