单表查询总结
单表查询
一、创建表
"""
auto_now:每次修改数据的时候 都会自动更新时间
auto_now_add:在创建数据的时候 会自动将当前时间记录下来
后期如果你不认为修改的话 数据不变
"""
# Create your tests here.
# settings.py 查看sql执行语句
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level': 'DEBUG',
},
}}
# models.py
class Book(models.Model):
title = models.CharField(max_length=50)
price = models.DecimalField(max_digits=8, decimal_places=2)
publish_data = models.DateField()
def __str__(self):
return self.title
# test.py
if __name__ == '__main__':
# 测试文件必须引用下面两句话才可以使用orm,和配置环境
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "one_search.settings")
import django
django.setup()
二、增删改查
# 1.1 增加数据 create方法
res = models.Book.objects.create(title='金老板, price=222.222, publish_data='2019-10-24')
# 1.2 增加数据 save方法
book_obj = models.Book(title='武大郎', price=4444.44, publish_data='2019-8-8')
book_obj.save()
# 修改数据
# 2.1 修改数据 update,满足条件全部修改
models.Book.objects.filter(pk=1).update(price=999.66)
# 2.2 修改数据 save方法(修改不推荐使用,效率低)
book_obj = models.Book.objects.filter(pk=1).first()
print(book_obj) # Book object
book_obj.title = '不符社会主义核心价值观'
book_obj.save()
print(book_obj.save()) # none
# 3.删除数据 delete方法
book_obj = models.Book.objects.filter(pk=3).delete()
print(book_obj) # (1, {'app01.Book': 1})
# 4 十三种查找方法
# 方法一: all查询所有 返回QuerySet类表
book_obj = models.Book.objects.all().first()
print(book_obj) # Book object
print(book_obj.title)
print(book_obj.price)
# 方法二: filter() 条件查询,可以多个条件,条件不存在不会报错 返回QuerySet类表
# 只要是queryset对象就可以无限制的点queryset对象的方法,可以,queryset.filter().filter().filter()
book_obj =models.Book.objects.filter(pk=1).first()
print(book_obj) # Book object
print(book_obj.title)
print(book_obj.price)
print(book_obj.publish_data)
# 方法三: get() 条件查询,条件不成立则会报错 返回对象数据本身
book_obj = models.Book.objects.get(pk=1)
print(book_obj)
print(book_obj.title)
print(book_obj.price)
print(book_obj.publish_data)
# 方法四:first() 获取查询列表中结果, 第一个
book_obj = models.Book.objects.all()
book_obj = book_obj.first()
print(book_obj)
print(book_obj.title)
print(book_obj.price)
print(book_obj.publish_data)
# 方法5: last() 获取查询列表中结果,最后一个
book_obj = models.Book.objects.all()
book_obj = book_obj.last()
print(book_obj)
print(book_obj.title)
print(book_obj.price)
print(book_obj.publish_data)
# 方法6:exclude 除此之外 返回 QuerySet
book_obj = models.Book.objects.exclude(pk=2)
print(book_obj)
# 方法7:values 获取的是对应字段值,类表套字典 QuerySet,参数可以有多个
book_obj = models.Book.objects.values('title', 'price')
print(book_obj) # <QuerySet [{'title': '不符社会主义核心价值观'}, {'title': '武大郎'}]>
# 方法8:values_list 获取的是对应字段值, 类表套元组 返回QuerySet()
book_obj = models.Book.objects.values_list('title')
print(book_obj)
# 方法9:count() 统计表中数据的个数
book_obj = models.Book.objects.count()
print(book_obj, type(book_obj)) # 2 <class 'int'>
# 方法10:distinct() 去重, 数据必须是一模一样的情况下才能去重
book_obj = models.Book.objects.distinct()
print(book_obj)
res1 = models.Book.objects.values('title','price').distinct()
print(res1)
# 方法11: order_by() 排序, 默认是升序,加符号就是降序
book_obj = models.Book.objects.order_by('price')
print(book_obj)
book_obj1 = models.Book.objects.order_by('-price')
print(book_obj1)
# 方法12:reverser() 前面必须是先把结果排序才可以反转
book_obj = models.Book.objects.order_by('price').reverse()
print(book_obj)
# 方法13:exists() 判断是否存在 bool
book_obj = models.Book.objects.filter(pk=1).exists()
print(book_obj)
三、神奇的双下划线查询
特点:字段名__关键字
#1. 查询价格大于200的书籍
book_obj = models.Book.objects.filter(price__gt=200)
print(book_obj)
#2. 查询价格小于200的书籍
book_obj = models.Book.objects.filter(price__lt=200)
print(book_obj)
# 3. 查询价格大于或者等于200的数据
book_obj = models.Book.objects.filter(price__gte=200)
print(book_obj)
# 4. 查询价格大于或者等于200的数据
book_obj = models.Book.objects.filter(price__lte=200)
print(book_obj)
# 5. 价格是200 或者是123.23 或者666.66, 注意精度问题
book_obj = models.Book.objects.filter(price__in=[200, 999.66,123.23 ])
print(book_obj)
# 6. 价格在200 到 700之间的书籍
book_obj = models.Book.objects.filter(price__range=(200, 1000))
print(book_obj) # <QuerySet [<Book: 不符社会主义核心价值观>]>
四、模糊匹配
"""
like
%
_
"""
# 1. 查询书籍名称中包含p的,区分大小写
book_obj = models.Book.objects.filter(title__contains='p')
print(book_obj)
# 2. 查询书籍名称中包含p的,忽略大小写
book_obj = models.Book.objects.filter(title__icontains='p')
print(book_obj)
# 3. 查询书籍名称是以三开头的书籍
book_obj = models.Book.objects.filter(title__startswith='三')
print(book_obj)
# 4. 查询书籍名称是以P结尾的书籍
book_obj = models.Book.objects.filter(title__endswith='P')
print(book_obj)
# 5. 查询出版日期是2019年的书籍
book_obj = models.Book.objects.filter(publish_data__year='2019')
print(book_obj)
# 6. 查询出版日期是10月的书籍
book_obj = models.Book.objects.filter(publish_data__month='10')
print(book_obj)
在当下的阶段,必将由程序员来主导,甚至比以往更甚。