Django Models Filter筛选条件与Get/Filter区别详解

Ryan
Ryan
发布时间:2026-10-13 | 4人浏览过
原创

本文详细解析Django ORM中Filter的多种筛选条件,涵盖精确匹配、范围查询及日期处理等常用参数。同时深入对比Objects.Get与Objects.Filter方法的差异:Get返回单个对象或报错,适用于唯一记录;Filter返回列表,适合多结果场景。此外还介绍了利用Values结合Distinct获取字段唯一值的高级用法,帮助开发者更高效地进行数据库查询操作。

Django Filter筛选条件详解

在使用Django的QuerySet进行条件筛选时,Filter方法用于执行等于(=)条件的查询,而Exclude方法则用于执行不等于(!=)条件的反向筛选。

若需去除查询结果中的重复记录,可调用QuerySet的distinct()方法。

Django ORM提供了丰富的字段查找后缀,具体对应关系如下: - __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表示字段不为空。

示例中,q1.filter(pub_date__gte=datetime.date.today())表示查询发布日期大于或等于当前时间的记录;而q1.exclude(pub_date__gte=datetime.date.today())则表示排除发布日期大于或等于当前时间的记录,即查询发布日期小于当前时间的记录。

在Django Models中,有时需要获取某个字段的distinct(去重)值。

这对应于SQL语句中的select distinct xxx from table_name功能。

使用values()方法会生成ValuesQuerySet,其结构类似于由多个字典组成的列表。由于QuerySet系列对象采用惰性求值策略,仅在遍历时才执行数据库查询,因此推测在处理大数据量时不会产生额外的性能开销。

获取字段唯一值的代码示例为:xxxx.objects.values("field_name").distinct()

或者采用另一种写法:

xxxx.objects.distinct().values("field_name")

Get与Filter方法区别对比

补充知识:Django中Objects.Get与Objects.Filter方法的区别。

为了清晰说明两者的区别,这里定义两个Model。


class Student(models.Model): 
   name = models.CharField('姓名', max_length=20, default='') 
   age = models.CharField('年龄', max_length=20, default='') 
class Book(models.Model): 
   student = models.ForeignKey(Student) 

一、首先介绍Django的Obj.Get()方法:

Django的get()方法从数据库中获取匹配的结果,并返回一个对象。如果数据库中不存在匹配的记录,该方法会抛出异常报错。

例如,假设数据库中有一条记录,其name字段的值为"django",执行student = Student.objects.get(name='django'),

将返回一个记录对象。可以通过student.__dict__查看其内部结构,它返回的是一个字典形式,其中key为字段名称,values为字段值。

如果使用get()方法查询数据库中不存在的记录,程序将会报错。

例如:

student = Student.objects.get(name='python')

如果使用Django的get()方法查询关联表数据,而关联表中匹配的记录多于2条,同样会报错。

例如,我的student表中有一条记录:

id name age 1 python 24

book表数据如下:

id student_id 1 1 2 1

执行相关查询时:


  student = Student.objects.get(name='python') 
  book = Book.objects.get(student) 

程序会报错,因为book表中有2条记录与student表中的记录相匹配,违反了get()方法只能返回单一对象的要求。

二、接着介绍Django的Filter方法:

Django的filter()方法从数据库中获取匹配的结果,并返回一个对象列表。如果数据库中不存在匹配的记录,它将返回一个空列表[]。

例如,假设数据库中有一条记录,其name字段的值为Python,执行

student = Student.objects.filter(name='python')

返回的student是一个对象列表。可以看出,student[0]与上述get()方法返回的student结果是一致的。

以上关于Django models filter筛选条件的详解内容,希望能为大家提供参考,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表