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:

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



