5-1.查询
(1)F对象
对象的属性与常量值比较,不需要用F对象,但是 对象的属性与对象的属性比较(字段比较)
BookInfo.objects.filter(bread__gte=F('bcomment') * 2) 把属性放到F对象中,且可以在F对象上使用算数运算
(2)Q对象
其实就是and , or , not ,当使用&表示逻辑与,|表示逻辑或,必须用Q对象
BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
BookInfo.objects.filter(~Q(pk=3))
(3)聚合函数 使用aggregate()过滤器调用聚合函数
Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和
BookInfo.objects.aggregate(Sum('bread'))
注意aggregate的返回值格式
如:{'bread__sum':3} ({'属性名__聚合类小写':值})
所以需要['bread__sum']拿到值
(4)排序
BookInfo.objects.all().order_by('-bread') 降序 有符号
(5)关联查询
在多的一方会有属性声明属于谁
hero.hbook
一的一方: 类名小写_set
book.heroinfo_set.all()
5-2.修改
对象.save() 修改然后提交
模型类.objects.filter().update() 是查询和修改一起执行了
5-3.删除
对象.delete()
模型类.objects.filter().delete()
6.查询集 QuerySet 其实就是查询结果的对象集合
以下过滤器: 都是得到对象集合
all():返回所有数据。
filter():返回满足条件的数据。
exclude():返回满足条件之外的数据。
order_by():对结果进行排序。
小点:exists():判断查询集中是否有数据,如果有则返回True,没有则返回False
两大特性:
(1)惰性执行 qs = BookInfo.objects.all()
类似Flask的lazy选项,并没有真正执行拿到结果,只是生成sql语句准备着
(2)缓存 重复的查询语句会缓存结果,减少对mysql数据库的操作
小点: 查询回来的内容比较像列表,是支持切片的,但是没有负数
qs = BookInfo.objects.all()[0:2]
8.管理器Manager
其实django中查询使用的objects 和 flask中使用的query 都是管理器
而django中根据具体的需求可以自定义管理器,所以objects可以是你写的东西,就是换个管理器名字
7-1.修改查询集
# 原本的all不能过滤is_delete的内容,所以自定义管理器,重写all()方法
# 自定义管理器 继承 models.Manager
class BookInfoManager(models.Manager):
def all(self):
# super() 继承原本的all方法
# 其实就是在原本的all方法查询的结果上,加了一个条件(没有删除的)
return super().filter(is_delete=False)
# 在模型类BookInfo中创建管理器对象,之后使用这个
class BookInfo(models.Model):
...
# 写成flask的query
query = BookInfoManager()
使用方法: BookInfo.query.all()
7-2.在管理器类中定义新的方法
class BookInfoManager(models.Manager):
# 其实就是调用方法并且传参 用于创建图书
def create_book(self, title, pub_date):
# 每次在赋值book的具体内容前,需要初始化book = BookInfo()
# 相同的道理,因为是在类中,所以self.modes()
# 也是初始化模型类,这样赋值接下来才能放到模型类中
book = self.model()
book.btitle = title
book.bpub_date = pub_date
book.bread=0
book.bcommet=0
book.is_delete = False
book.save()
return book
# 在模型类BookInfo中创建管理器对象,之后使用这个
class BookInfo(models.Model):
...
objects = BookInfoManager()
使用:book=BookInfo.objects.create_book("abc",date(1980,1,1))