
Django模型条件过滤 querySet.filter(**conditions)用法详解
5星
- 浏览量: 0
- 大小:None
- 文件类型:PDF
简介:
基于Django框架,`model`类象征着数据表的抽象概念。而`queryset`则代表用于操作这些模型实例集合的数据结构。在Django ORM框架内,该函数$`queryset.filter(**conditions)`$扮演着重要角色,负责从查询集合中提取符合条件的数据。本文旨在详细解析Django ORM中的`filter()`方法及其相关参数设置,帮助开发者优化查询逻辑。`queryset.filter(**conditions)`这一功能用于获取满足给定参数的实例。其中`**conditions`属于一个字典,其键值对对应指定的字段及其过滤条件。例如:```python
queryset = model.objects.all()
condtions = {date: 2018-05-22}
query_res = queryset.filter(**condtions)
```该代码将返回所有日期属性值等于2018-05-22的模型记录实例。
对于字段比较操作,Django提供了丰富的一系列运算符,具体内容如下所示:
- 使用`__exact`实现精确匹配功能,具体语法形式为:`field__exact: value`
- 通过`__iexact`可实现不区分大小写的精确匹配效果,其表达方式为:`field__iexact: value`
- 实现字段包含关系判断的运算符是`__contains`,这与SQL中的`LIKE %value%`功能一致,具体写法如下:$field__contains: value$
- 通过不区分大小写的逻辑实现包含性匹配的运算符是`__icontains`,其表达方式为:$field__icontains: value$
- 实现字段大于值比较的运算符是`__gt`,具体的使用方法为:$field__gt: value$
- 类似地,用于实现字段大于等于操作的运算符是`__gte`,其写法如下:$field__gte: value$
- 通过运算符`__lt`可以进行字段小于值比较操作,具体形式为:$field__lt: value$
- 对应的不大于操作可以通过不区分大小写的运算符`__lte`来实现,其表达方式是:$field__lte: value$
- 实现字段属于特定范围判断的运算符是`__in`,具体的使用方法为:$field__in: [value1, value2, ...]$
- 以某个字符串开头匹配的条件可以用运算符`__startswith`来表示,具体写法如下:$field__startswith: value$
- 不区分大小写的前缀匹配操作可以通过运算符`__istartswith`实现,其表达方式为:$field__istartswith: value$
- 以某个字符串结尾匹配的条件可以用运算符`__endswith`来表示,具体形式如下:$field__endswith: value$
- 对应的不区分大小写的后缀匹配操作可以通过运算符`__iendswith`实现,其写法为:$field__iendswith: value$
- 实现字段在指定范围内的查找条件可以使用运算符`__range`,具体的语法形式是:$field__range: (start, end)$
- 用于筛选日期字段的年份、月份和日期的运算符分别是`__year`, `__month`, 和`__day`
- 最后,判断字段值是否为`NULL`的条件可以通过运算符`__isnull`来实现。若其返回结果为$True$,则表示该字段的实际值为空;反之,则表明实际值不为空。
多种不同的条件可以通过合理搭配进行组合使用。如下面列举的实例中所示。```python
condtions = {date__lt: 2018-05-22, status: 未支付, name__exact: yangxia}
query_res = queryset.filter(**condtions)
```该查询将返回所有在earlier于2018年5月22日之前、状态为未支付并且name与yangxia完全一致的记录。`queryset.exclude(**conditions)`反向于`filter()`,其作用在于过滤掉满足特定条件的数据项。通过删除查询集合中的重复数据项,可以使用`querySet.distinct()`方法来实现去重功能。当在实际应用场景中需求涉及多于一个关键词时,通过`Q`对象来进行复合查询是可行的。`Q`对象则赋予我们建立复杂而精确的逻辑表达式的权利或能力。比如:```python
from django.db.models import Q
keywords = [key1, key2]
query_res = model.objects.filter(Q(title__contains=keywords[0]) | Q(title__contains=keywords[1]))
```该函数会返回满足以下条件的所有记录:标题中包含`key1`或`key2`。此外,在`Django`框架的高级数据操作中,可以通过连续调用`queryset.filter()`和`queryset.exclude()`的方法,构建出更为复杂的数据查询逻辑。比如:在实际应用中,我们可以利用这些方法来实现动态且复杂的查询需求。```python
q1 = model.objects.filter(headline__startswith=What)
q2 = q1.filter(pub_date__gte=datetime.date.today())
q3 = q2.exclude(body_text__icontains=food)
```该系统将包含题库中的标题均采用以“`What`”开头的形式,并且包括发布日期早于或等于今天的记录,同时排除了所有涉及与“food”相关的内容。Django的`queryset.filter()`方法采用了便捷的方式进行数据库查询操作,并支持多样化的条件过滤与逻辑组合功能。该库通过这些特点帮助开发者轻松应对复杂的数据库查询需求。此外,结合与Django内置`Q`对象和链式调用方式,能够灵活构造适用于不同复杂场景的数据库查询语句。
全部评论 (0)


