Django:模型_ORM查询条件

本文详细介绍了Django ORM中的查询条件,包括exact、iexact、contains、icontains、in、gt、gte、lt、lte、startswith、istartswith、endswith、iendswith、range、date、time、year、isnull、regex、iregex等,以及如何根据关联表进行查询。示例代码展示了各种查询条件在实际应用中的用法,帮助理解Django ORM查询的灵活性和强大性。
摘要由CSDN通过智能技术生成

查询操作

1、查找是数据库操作中一个非常重要的技术。查询一般就是使用filter、exclude以及get三个方法来实现。我们可以在调用这些方法的时候传递不同的参数来实现查询需求

2、在ORM层面,这些查询条件都是使用field+__+condition的方式来使用的。其中condition是查询条件,类似于原生SQL语句中的WHERE过滤语句

3、在使用原生SQL语句进行查找数据时,一般情况下都会根据某个字段(列)符合某个条件来进行查询的。在ORM模型中查找数据也是这样的:根据某个字段来查找时,只需要在这个字段后面加上"__",然后再在后面加上查询条件就可以了

 

exact

1、完全匹配运算符:使用精确的=进行查找

2、由于完全匹配的使用使用频率最高,所以Django将exact定义为默认查询条件。
    ⑴即:如果在过滤语句中没有指定查询条件,那么Django将按照完全匹配查找数据
    ⑵如:Article.objects.get(id=15)等价于Article.objects.get(id__exact=15)

3、如果在exact运算符右侧的值指定为None,那么在翻译成SQL语句的时候就会按照SQL中的NULL进行比较
    ⑴Article.objects.get(id__exact=15)等价于SELECT * FROM `polls_article` WHERE ID = 15
    ⑵Article.objects.get(id__exact=None)等价于SELECT * FROM `polls_article` WHERE ID is NULL

例1:
⑴编辑视图

注:
1、上面例子中分别使用了get()和filter()方法来查找数据,可以看到使用不同的方式时,返回值的数据类型是不一样的
    ⑴使用get()方法来获取查找数据时,直接返回了一个满足条件的模型类:这是才能使用"模型类名.列名"来获取具体某列的值
    ⑵使用filter()方法来获取查找数据时,返回的是一个QuerySet对象,QuerySet对象是不能直接使用"QuerySet对象名.列名"来获取具体某列的值。需要先使用for循环来遍历得到每条数据的模型类,然后才能使用"模型类名.列名"来获取具体某列的值。这里的列名指的是定义的模型类中列的属性名QuerySet对象具体的方法后面会介绍
    ⑶当使用get()方法获取查找的数据时,如果没有查找到对应的数据Django就会报错。而使用filter()方法来获取查找的数据时,如果没有查找到数据时,就会返回一个空的QuerySet对象
    ⑷即:在查找数据时,返回数据的类型是由获取方法来决定的,跟过滤条件等是没有关系的

2、上面代码中的"(title__exact="三国演义")"就相当于是原生SQL语句中的WHERE过滤语句
    ⑴整体格式为:需要过滤的字段名__过滤条件
    ⑵title:需要过滤的字段名
    ⑶exact:过滤条件(这里是等于),就相当于是WHERE中的运算符
    ⑶exact="三国演义":中的"="只是赋值,对过滤条件没影响

3、通过返回数据下的query属性可以看到ORM语句翻译成原生SQL语句:只有返回值为QuerySet对象时才能使用这个属性(使用get()方法获取数据时是不能使用该属性的)

 

iexact

1、使用like进行查找:等同于exact,但是不区分字母大小写

2、在原生SQL语句中like语句一般用于模糊查找,即查找包含某个字符的数据。只是说这里查找的字符串两边没有通配符,因此就相当于是exact了,为精确查找

3、exact和iexact:它们的区别就是LIKE和=的区别,exact会被翻译成=,而iexact会被翻译成LIKE

例2:
⑴查看数据库数据

⑵编辑视图

 

contains

1、大小写敏感,判断某个字段是否包含某个数据(也是使用LIKE语句来判断是否包含某个字符且有通配符)

2、要注意的是:在使用contains的时候,翻译成的SQL语句左右两边是有百分号的(通配符),意味着使用的是模糊查询。而excat翻译成的SQL语句左右两边是没有百分号的,意味着使用的是精确查找

例3:
⑴查看数据库数据

⑵编辑视图

 

icontains

等同于contains运算符,只是忽略大小写

例4:
⑴编辑视图

 

in

1、提取那些给定的field的值是否在给定的容器中。容器可以为list、tuple或者任何一个可迭代的对象,包括QuerySet对象

2、等价于SQL语句中的IN操作符

例5:
⑴编辑视图


例5_1:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值