django学习-数据库(下)

本文介绍了Django ORM的基本操作,包括查询、修改、删除等核心功能,并详细讲解了F对象、Q对象、聚合函数的应用场景及使用方法,还探讨了自定义管理器的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5.数据库操作


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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值