Django基础教程(四十四)Django数据库查询接口之查找对象:Django查询秘籍:别再用Book.objects.all()一把梭了,老司机带你精准“捞鱼”!

Django查询秘籍:别再用Book.objects.all()一把梭了,老司机带你精准“捞鱼”!

嘿,Django开发者们,想必你们都经历过这样的场景:老板让你从成千上万的用户数据里,找出所有“VIP会员”、“最近一周登录过”并且“邮箱是Gmail”的用户。你眉头一皱,计上心来,大手一挥写下:

users = User.objects.all()
vip_gmail_users = []
for user in users:
    if user.is_vip and user.last_login > some_date and user.email.endswith('@gmail.com'):
        vip_gmail_users.append(user)

跑一下,程序吭哧吭哧转了5秒,内存飙升。你看着屏幕,心里嘀咕:“这代码,怎么闻起来有一股‘新手’的味道?”

停!兄弟,快住手!

你这操作,相当于为了钓几条特定的鱼,直接把整个太平洋的水都抽干了再来慢慢挑,既浪费资源(数据库带宽、内存),效率又低得令人发指。

Django的ORM(对象关系映射)给我们提供了一套强大到没朋友的查询接口,就是让你在数据库层面完成精准过滤的。今天,咱们就抛开抽水机,聊聊怎么用正确的“渔网”和“鱼饵”,优雅地从数据库里“捞”出你想要的对象。

第一章:你的第一张网——all()get()filter()

想象一下,Model.objects 就是你进入数据库宝库的管理员。你需要用正确的方式跟它沟通。

1. all(): 老实人的“全部打包”

all_books = Book.objects.all()

这就是我们开头说的“抽水机”。它返回的是一个包含所有记录的QuerySet(查询集)。注意,它现在还没真正执行查询,等你真正要用数据时(比如迭代或者打印),它才会去数据库里把数据“捞”回来。虽然它懒,但你要是真把它当列表用,它可是会实实在在把所有数据都加载出来的。

适用场景:当你真的需要所有数据时(这种情况其实很少)。

2. get(): 精准的“独苗钓饵”

当你确定你只想找一条,并且只有一条记录时,用它。

try:
    book = Book.objects.get(id=1)
except Book.DoesNotExist:
    print("兄嘚,你要的书不存在啊!")
except Book.MultipleObjectsReturned:
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值