关键词

详解Django的 filter() 函数:过滤查询集合

当我们需要从数据库中获取特定数据时,我们可以使用 Django ORM 的 filter() 函数来筛选满足需求的数据,其作用相当于 SQL 中 WHERE 子句。

filter() 函数的使用方法

filter() 函数的一般形式是:Model.objects.filter(过滤条件)

过滤条件可以是以下内容:

  • 精确等于:field=value
  • 大于、小于、大于等于、小于等于:field__gt=valuefield__gte=valuefield__lt=valuefield__lte=value
  • 列表、范围:field__in=[value1, value2, ...]field__range=[value1, value2]
  • 模糊查询:field__contains=valuefield__startswith=valuefield__endswith=value

其中,field 是模型类中的字段名,value 是你需要查询的值。除特殊说明外,查询符号(=>等)必须紧贴字段名,并用两个下划线隔开。

我们还可以通过 andornot 等逻辑操作符来组合条件。

实例一:

我们有以下模型:

class Member(models.Model):
    name = models.CharField(max_length=20)
    age = models.IntegerField()
    gender = models.CharField(max_length=1)

现在需要查询所有性别为男性且年龄在 18 岁到 30 岁之间的成员,可以这样实现:

men = Member.objects.filter(gender='M', age__range=[18, 30])

实例二:

现在有以下模型:

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
    publisher = models.CharField(max_length=50)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    pub_date = models.DateField()

现在需要查询所有价格大于等于 100 元且出版日期在 2020 年 1 月 1 日之后的图书,实现方式如下:

books = Book.objects.filter(price__gte=100, pub_date__gte='2020-01-01')

注意:日期格式应该符合 YYYY-MM-DD 的规范,否则会出现查询错误。

filter() 函数的返回值

filter() 函数的返回值是一个 QuerySet 对象,它实质上是一个查询结果集的惰性对象,也就是说并不会立即查询数据库,而是在调用它的方法时才会去执行 SQL 查询。

如果需要立即查看查询结果,则需要使用方法 list() 或者 for 循环遍历这个 QuerySet 对象,例如:

men_age_list = [men.age for men in men]

上述代码中,我们使用列表推导式对查询结果进行了处理,将查询结果中的每一条数据的年龄提取出来,存入了列表 men_age_list 中。

总结

  • filter() 函数用来从数据库中筛选查询符合一定条件的数据。
  • 过滤条件可以是精确等于、大于、小于、列表、范围、模糊查询等。
  • 查询结果是一个 QuerySet 对象。
  • QuerySet 对象是惰性对象,需要使用 list() 方法或者循环遍历才能立即查看查询结果。

本文链接:http://task.lmcjl.com/news/16259.html

展开阅读全文