一般操作
必知必会13条
<1> all(): 查询所有结果
ret = models.Book.objects.all() # QuerySet类型 --> 书籍对象的列表 print(ret) <QuerySet [<Book: Book object>]>
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
ret = models.Book.objects.filter(title='三国演义') #QuerySet类型 print(ret) <QuerySet [<Book: 三国演义:18.80>]> ret = models.Book.objects.filter(id=2) print(ret) <QuerySet [<Book: 水浒传:28.80>]> #ID值大于2的 # ret = models.Book.objects.filter(id__gt=1) # print(ret) # < QuerySet[ < Book: 水浒传:28.80 >] > #ID值小于3的 # ret = models.Book.objects.filter(id__lt=3) # print(ret) # < QuerySet[ < Book: 三国演义:18.80 >, < Book: 水浒传:28.80 >] > #查询出版社日期是2017年的书 # ret = models.Book.objects.filter(publisher_date__year=2017) # print(ret) #查询出版社日期大于2018年 # ret = models.Book.objects.filter(publisher_date__year__gt=2017) # print(ret) #查询书名中有包含三的书 # ret = models.Book.objects.filter(title__contains='三') # print(ret) # < QuerySet[ < Book: 三国演义:18.80 >] > # 查询书名中有包含三的书,并且书的出版社是2018年的 # ret = models.Book.objects.filter(title__contains='三',publisher_date__year=2018) # print(ret)
<3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
#get方法 如果检索条件找不到对象就报错 # ret = models.Book.objects.get(id=3) # print(ret) # 武松打虎: 11.00
<4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
#将满足条件的去掉,留下不满足条件的 # ret = models.Book.objects.exclude(id__in=[1,3,4]) # print(ret) #< QuerySet[ < Book: 水浒传:28.80 >, < Book: 就是你:222.00 >] >
<5> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
#取字段的值 # ret = models.Book.objects.filter(title='三国演义').values('title','price') # print(ret) # < QuerySet[{'title': '三国演义', 'price': Decimal('18.80')}] >
<6> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
#去字段的值,是一个元组 # ret = models.Book.objects.filter(title='三国演义').values_list('title','price') # print(ret)
<7> order_by(*field): 对查询结果排序
#按照字段排序从小到 大 # ret = models.Book.objects.all().order_by('price') # print(ret) #按照字段排序从大到小 # ret = models.Book.objects.all().order_by('-price') # print(ret)
<8> reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。
# ret = models.Book.objects.all().order_by('price').reverse().values('title') # print(ret)
<9> distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)
#连表查询 # ret = models.Book.objects.all().values('publisher__name').distinct() # print(ret) # < QuerySet[{'publisher__name': '新华社'}, {'publisher__name': '人民广播社'}, {'publisher__name': '黑豹社'}] >
<10> count(): 返回数据库中匹配查询(QuerySet)的对象数量。
#count计数 # ret = models.Book.objects.all().count() # print(ret)
<11> first(): 返回第一条记录
<12> last(): 返回最后一条记录
# first()和last() # ret = models.Book.objects.all().first() # 对象 --> 结果集中的第一个数据 # print(ret)
<13> exists(): 如果QuerySet包含数据,就返回True,否则返回False
# 判断结果集中是否有数据 ret = models.Book.objects.all().exists() # 布尔值 --> 结果集中是否有数据 print(ret)
Django终端打印SQL语句
在Django项目的settings.py文件中,在最后复制粘贴如下代码:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }