Django ORM是数据查询中Django最强大的功能之一。QuerySet是从Django模型中有效获取数据的基本工具,通过使用这个工具,可以轻松处理复杂的数据查询。本文将探讨什么是QuerySet如何使用它以及许多有用的数据查询功能


1. 什么是QuerySet?

QuerySet是在Django ORM中用于从数据库获取或操作数据的对象集合。简单来说,QuerySet可以看作是数据库查询(Query)执行结果的集合。使用QuerySet,可以获取、过滤和操作模型对象。

QuerySet封装了与数据库的交互,使得开发者无需直接编写SQL,可以通过直观的Python代码查询或操作数据。

Django QuerySet infographic

通过QuerySet可以做什么

  • 数据查询:可以根据多种条件查询存储在数据库中的记录。
  • 过滤:可以应用多个条件,只选择所需的数据。
  • 排序和切片:可以按所需顺序对数据排序或获取特定范围内的数据。

2. 基本查询方法的种类及使用示例

Django ORM提供了多种基本查询方法。这些方法在查询和过滤数据时非常有用。

2.1 all()

用于获取模型的所有数据的方法。

from myapp.models import Post

posts = Post.objects.all()
  • Post.objects.all()获取存储在Post模型中的所有对象。

2.2 filter()

当只想获取符合特定条件的对象时使用。

published_posts = Post.objects.filter(status='published')
  • filter()查询符合条件的对象,返回结果是QuerySet。

2.3 exclude()

用于获取排除特定条件的对象。

draft_posts = Post.objects.exclude(status='published')
  • exclude()filter()相反,查询不符合条件的对象。

2.4 get()

用于获取符合特定条件的单个对象。不过,当没有符合条件的对象或存在多个对象时会发生错误

post = Post.objects.get(id=1)
  • get()只在精确查询一个对象时使用,若没有结果或多个结果,则会引发DoesNotExistMultipleObjectsReturned异常。

3. ORM的运算符和过滤

QuerySet使用各种运算符来处理复杂的过滤条件。使用这些运算符可以对数据进行非常详细的过滤。

3.1 exact

用于查找完全匹配的值

post = Post.objects.filter(title__exact='My First Post')
  • title__exact过滤标题完全为'My First Post'的对象。

3.2 icontains

用于查找不区分大小写的部分字符串是否包含。

posts = Post.objects.filter(title__icontains='django')
  • title__icontains查询所有标题包含'django'的帖子。

3.3 gt, lt (大于,小于)

用于在数字或日期值上设置大于或小于条件。

recent_posts = Post.objects.filter(publish_date__gt='2024-01-01')
  • publish_date__gt过滤在2024-01-01之后发布的帖子。gt表示greater thanlt表示less than

此外,还可以使用startswithendswithin等多种运算符,简单实现多种过滤条件


4. 反向引用:通过外键连接模型间的关系查询

在Django ORM中,反向引用是指通过外键(Foreign Key)连接的模型之间的关系来查询数据。通过反向引用可以方便地查询父子关系的关系数据库。


4.1 使用related_name进行反向引用

在定义外键时使用related_name选项,可以在进行反向引用时使用更易读的名称。

示例
class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    text = models.TextField()
用法
post = Post.objects.get(id=1)
comments = post.comments.all()
  • post.comments.all()可以获取该文章的所有评论。如果没有设置related_name,默认名称为comment_set

结论

Django ORM的QuerySet是与数据库进行交互的强大工具,通过各种方法和运算符可以有效地查询和操作所需的数据。本文讨论了基本的QuerySet用法,以及如何过滤数据和进行反向引用。

上述内容只是ORM查询功能的非常基础的入门。实际上,Django的QuerySet拥有更丰富和强大的方法,组合使用这些方法可以查询数据。将来,我会撰写一篇文章逐一介绍和分析QuerySet的各种方法。

在下一篇文章中,我将讨论QuerySet的性能优化延迟评估(lazy evaluation)的概念,了解更好的性能数据访问方法。敬请期待!