📜  django 模型过滤器 - Python (1)

📅  最后修改于: 2023-12-03 15:14:44.263000             🧑  作者: Mango

Django 模型过滤器

Django 模型过滤器是用于对 QuerySet 进行筛选和排序的方法。它可以帮助我们轻松地从数据库中获取所需的数据,提高开发效率。本文将介绍 Django 模型过滤器的常用方法及其使用。

基础用法

在 Django 中,我们可以使用 filter() 方法对 QuerySet 进行条件筛选。例如,我们获取所有用户名为 test 的用户可以这样写:

User.objects.filter(username='test')

这条语句将返回一个 QuerySet,其中包含了用户名为 test 的所有用户对象。我们可以在 filter() 方法中传入多个筛选条件,用逗号分隔即可。例如,以下语句可获取用户名为 test 且年龄为 18 岁的用户:

User.objects.filter(username='test', age=18)
精确匹配

除了等于号 =,我们还可以使用其他符号进行精确匹配。以下是常用的符号:

  • __exact:精确匹配,区分大小写
  • __iexact:精确匹配,不区分大小写
  • __in:精确匹配多个值
  • __gt:大于
  • __lt:小于
  • __gte:大于等于
  • __lte:小于等于
  • __startswith:以指定字符串开头
  • __istartswith:以指定字符串开头,不区分大小写
  • __endswith:以指定字符串结尾
  • __iendswith:以指定字符串结尾,不区分大小写
  • __contains:包含指定字符串
  • __icontains:包含指定字符串,不区分大小写

例如,以下语句可获取用户名以 test 开头的用户:

User.objects.filter(username__startswith='test')
外键

如果我们有一个外键字段,可以使用外键字段名加上下划线加另一个字段名来访问其属性。例如,如果我们有一个模型 Author,其中有一个外键 user 指向 User 模型,我们可以这样获取用户名为 test 的作者:

Author.objects.filter(user__username='test')
跨关联查询

如果需要在一条语句中查询两个关联模型之间的所有相关对象,则需要使用双下划线。例如,我们有一个 Blog 模型,其中有一个外键 author 指向 Author 模型,我们可以找出用户名为 test 的作者所写的所有博客:

Blog.objects.filter(author__user__username='test')
排序

我们可以使用 order_by() 方法对 QuerySet 进行排序。例如,我们按照日期降序排列:

Blog.objects.order_by('-created_at')

这将返回一个 QuerySet,其中的对象按照 created_at 时间的倒序排列。

延迟查询

Django 查询是惰性的,只有当我们需要使用 QuerySet 中的数据时,它才会将数据从数据库中加载到内存中。因此,我们可以在 QuerySet 上进行多次筛选和排序,然后一次性地获取它们的结果,这将大大减少查询数据库的次数。

例如,我们可以将筛选和排序的 QuerySet 赋值给一个变量,然后在需要时再调用它们:

authors = Author.objects.filter(user__username='test').order_by('-created_at')

这个 authors 变量不会立即执行查询,只有在我们需要访问其中的数据时才会执行查询。

总结

Django 模型过滤器是一个强大的工具,它可以帮助我们轻松地从数据库中获取所需的数据。在使用模型过滤器时,需要仔细考虑所筛选的模型、所用的符号和筛选条件、排序的方式以及是否需要使用查询延迟技术,从而提高查询效率。