Django 查询技巧总结 - 定期更新

水木兰 · 2018年06月03日 · 890 次阅读

最近刚开始学习 Django 这个框架,在应用过程中遇到了一些关于 QuerySet 查询的问题。特整理出来,记录在这里,也希望大家多多分享。

查询数量

如果单纯查询数量的时候,要使用 .count()
不要使用 len(object_list)方式。

不等于

如果要查询状态不等于3的话,那么应该这样写:

from django.db.models import Q
count = Info.objects.filter(~Q(status=3)).count()

生成 SQL如下:

SELECT COUNT(*) AS `__count` FROM `infos_info` WHERE NOT (`infos_info`.`status` = 3);

多条件查询

一般情况下,可以在 filter()方法中写入多个字段的查询条件。
每个字段条件用逗号相隔即可。

但是,在有特殊查询符号的时候,应该尽量避免这种写法。
最好使用多个 filter()方法,连接起来,以免产生错误。

示例:查询某个用户状态不等于2的所有评论数量

Comment.objects.filter(~Q(status=2), user=user).count()

生成 SQL 如下:

SELECT COUNT(*) AS `__count` FROM `infos_comment` WHERE NOT (`infos_comment`.`status` = 2 AND `infos_comment`.`user_id` = 12);

从生成的 SQL语句,可以看出 NOT()方法的范围。这并不是我们想要的结果。
所以,正确的写法应该是:

Comment.objects.filter(~Q(status=2)).filter(user=user).count()

生成 SQL 如下:

SELECT COUNT(*) AS `__count` FROM `infos_comment` WHERE (NOT (`infos_comment`.`status` = 2) AND `infos_comment`.`user_id` = 13);

使用OR (或者)条件查询

from django.db.models import Q
User.objects.filter(Q(state=0) | Q(state=1))
共收到3条回复
Zilla · 2018年06月03日

Django 的后台功能比较方便,但是 orm 框架不如 ruby on rails 好使。

水木兰 · 2018年06月07日

@Zilla:我没有用过 ruby。不过我感觉 Django 挺方便的。

家龙 · 2018年06月07日

继续写啊

我要评论
登录之后,才能够回复。如果您还没有帐号,请先注册
小甜饼

构成我们学习最大障碍的是已知的东西,而不是未知的东西。 —— 贝尔纳