Django(6) 单表查询
单表查询
1、增加数据 create关键字
res = models.Books.objects.create(title='三国演义',price=238)
这句话的意思是:寻找名字是三国演义和价格是238的信息
res=Books object --> 书籍对象
2、查询数据 all,filter
(1) res1 = models.Books.objects.all() --> 查询所有数据
这里res1是QuerySet对象 QuerySet.query 可以查询原生的sql语句
(2) res2 = models.Books.objects.filter() -->括号里没有填东西就是查所有
(3) res2 = models.Books.objects.filter(title='三国演义') -->查名字等于三国演义的书
<res =QuerySet [<Books: Books object>]> -->它如果要拿到查询对象需要.first()
(4) res1 = models.Books.objects.get(title='大猫')
res1 = Books object 可以直接拿到对象
# 但是不推荐使用
'''fliter方法 条件不存在会返回空
get方法 条件不存在会报错'''
3、修改数据 先filter再update
res = models.Books.objects.filter(pk=1).update(price=666)
此时res就是影响的行数
修改数据还有另外一种方式
book_obj=models.Books.objects.filter(pk=2).first()
book_obj=models.Books.objects.filter(pk=2)[0]
book_obj.price=888
book_obj.save()
save()这个方法效率很低,会把所有的字段重新写,哪怕是一模一样的数据会重新写一遍
4、删除数据
models.Books.objects.filter(pk=2).delete()
5、Queryset对象还支持切片操作 但是只能填正数
6、last() 取最后一个数据对象
7、values() 获取数据指定字段的值
res = models.Books.objects.all().values('title','publish_time')
print(res)
<QuerySet [{'title': '三国演义', 'publish_time': datetime.date(2022, 2, 17)}, {'title': '三国演义', 'publish_time': datetime.date(2022, 2, 17)}, {'title': '西游记', 'publish_time': datetime.date(2022, 2, 17)}, {'title'...
# 用values()的时候all()可以不佳
8、 values_list()
res = models.Books.objects.all().values_list('title','publish_time')
print(res)
<QuerySet [('三国演义', datetime.date(2022, 2, 17)), ('三国演义', datetime.date(2022, 2, 17)), ('西游记', datetime.date(2022, 2, 17)), ('三国演义', datetime.date(2022, 2, 17)), ('西游记', datetime.date(2022, 2, 17)), ('小猫', datetime.date(2022, 2, 17)), ('小猫', datetime.date(2022, 2, 17)), ('小猫', datetime.date(2022, 2, 17)), ('大猫', datetime.date(2022, 2, 17))]>
# 这里就没有字段名了,直接是列表套元组
9、排序
res = models.Books.objects.order_by('price') -->升序
res1 = models.Books.objects.order_by('-price') -->降序
10、统计条数
res2 = models.Books.objects.count()
11、查重
res3 = models.Books.objects.all().distinct() # -->只要有主键值就是没有办法删的
⚠️:以某一个键来查重是可以的
res3 = models.Books.objects.values('title').distinct()
print(res3)
12、excluede 除...之外
res3 = models.Books.objects.exclude(title='西游记')
print(res3)
13、反向排序-->必须得是排序过后才可以用反向排序
res4=models.Books.objects.order_by('price').reverse()
14、13、exists() 如果当前查询的数据有数据就返回True 没有就返回False
双下划线查询
双下划线查询就是范围查找
# 大于
res = models.Books.objects.filter(price__gt=100)
# 大于等于
res3 = models.Books.objects.filter(price__gte=100)
# 小于
res1 = models.Books.objects.filter(price__lt=100)
# 小于等于
res4 = models.Books.objects.filter(price__lte=100)
# 成员运算
res5 = models.Books.objects.filter(price__in=[666, 888, 100])
# 范围查找
res6 = models.Books.objects.filter(price__range=(500, 700))
# 包含 (区分大小写)
res7 = models.Books.objects.filter(title_container='s')
# 包含 (不区分大小写)
res8 = models.Books.objects.filter(title_icontainer='s')
# 以...开头
res9 = models.Books.objects.filter(title__startswith='西')
# 年
res10 = models.Books.objects.filter(publish_time__year=2021)
# 月
res11 = models.Books.objects.filter(publish_time__month=3)
# 日
res12 = models.Books.objects.filter(publish_time__day=1)