Django Model条件过滤:filter与exclude用法及多关键字匹配详解
本文详解Django中QuerySet的条件过滤方法。通过字典解包**conditions实现多条件组合,解析filter(等于)与exclude(不等于)的区别。介绍__exact、__contains等常用查询操作符,并演示如何利用Q对象结合|运算符实现SQL中regexp类似的多关键字匹配逻辑,帮助开发者高效构建复杂数据库查询。
Django基础过滤示例
首先,以下代码展示了如何查询Model对应数据库中日期字段等于2018-05-22的数据记录:
queryset = model.objects.all()
condtions: {'date': '2018-05-22'}
query_res = queryset.filter(**condtions)
其次,以下代码演示了如何查询Model对应数据库中日期字段小于2018-05-22的数据记录:
queryset = model.objects.all()
condtions: {'date__lt': '2018-05-22'}
query_res = queryset.filter(**condtions)
总结而言,在使用QuerySet进行条件筛选时,filter方法用于表示“等于”条件的匹配,而exclude方法则用于表示“不等于”条件的排除。
常用查询操作符详解
使用querySet.distinct()方法可以去重。
以下是常用的查询操作符及其含义: __exact 精确等于,类似SQL中的 like 'aaa' __iexact 精确等于且忽略大小写,类似 ilike 'aaa' __contains 包含子串,类似 like '%aaa%' __icontains 包含子串且忽略大小写,类似 ilike '%aaa%'。需注意,在SQLite数据库中,contains的效果等同于icontains。 __gt 大于 __gte 大于等于 __lt 小于 __lte 小于等于 __in 存在于给定的列表范围内 __startswith 以指定字符串开头 __istartswith 以指定字符串开头且忽略大小写 __endswith 以指定字符串结尾 __iendswith 以指定字符串结尾且忽略大小写 __range 在指定的时间或数值范围内 __year 匹配日期字段的年份 __month 匹配日期字段的月份 __day 匹配日期字段的日 __isnull 判断字段是否为空,值为True或False
如果传入的参数是一个字典,例如:
conditions: {'date__lt': '2018-05-22', 'status': '未支付', 'name__exact': 'yangxia'} 此时,Entry.objects.filter(**conditions) 的执行效果等同于 Entry.objects.filter(date__lt='2018-05-22', status='未支付', name__exact='yangxia')。
上述代码对应的SQL语句翻译如下:
select * from Entry.objects where date<='2018-05-22' and status='未支付' and name like 'yangxia'
filter与exclude使用示例
以下是filter方法的示例:
>> q1 = Entry.objects.filter(headline__startswith="What")
>> q2= q1.filter(pub_date__gte=datetime.date.today())
>>> q3= q.filter(pub_date__lte=datetime.date.today())
以下是exclude方法的示例:
>>> q1 = q.exclude(body_text__icontains="food")
>> q2 = q1.exclude(pub_date__gte=datetime.date.today())
多关键字匹配解决方案
补充知识:如何使用Django的objects.filter()方法匹配多个关键字
介绍:
今天在使用Django时,考虑到如何匹配多个关键字的需求。我们知道Django提供了objects.filter()方法,可以通过如下代码实现匹配数据库中title包含key关键词的文章名称。
table.objects.filter(title__contains=key)
问题:
但是我的需求是我不仅仅只需要匹配出一个关键字的文章而是多个关键字的文章,那么我们该如何使用django的objects.filter()?
table.objects.filter(title__contains=key1)+.objects.filter(title__contains=key2)+....?
解决:
我们都知道在正常的sql语句中如果我们需要匹配多个关键字的title可以这样做
select title from data where title regexp 'key1|key2' select title from data where title like '%key1%' or like '%key2%'
以上的两种sql语句都是选择出title属性中存在key1和key2的所有文章,那么django是不是也会有一种方法匹配多个关键字呢?当然有就是下面的代码
from django.db.models import Q table.object.filter(Q(title__startswith='key1') | Q(title__startswith='key2'))
首先导入django的Q方法然后在filter中添加对应的匹配即可
以上这篇django model 条件过滤 queryset.filter(**condtions)用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









