目录

  1. 什么是 Django ORM?
  2. 创建和迁移模型
  3. Django ORM 查询基础
  4. 单表实例的创建、读取、更新和删除 (CRUD)
  5. 使用查询集过滤数据
  6. 常见问题与解决方案
  7. 参考资料

1. 什么是 Django ORM?

Django ORM(Object-Relational Mapping)是 Django 框架中的一部分,它允许你使用 Python 代码来操作数据库,而不需要编写 SQL 查询语句。Django ORM 会将数据库表映射为 Python 类,将表的每一行映射为类的实例,并允许你通过操作这些类的实例来进行数据库操作。


2. 创建和迁移模型

在 Django 中,数据库表是通过定义模型(models.py)来创建的。模型是 Django ORM 与数据库交互的核心。

2.1 创建模型

首先,在应用的 models.py 文件中定义模型。例如,我们定义一个 Article 模型来表示文章:

# myapp/models.py
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)  # 文章标题
    content = models.TextField()  # 文章内容
    published_date = models.DateTimeField(auto_now_add=True)  # 发布日期

    def __str__(self):
        return self.title

在这个模型中,我们定义了 titlecontentpublished_date 字段,分别表示文章的标题、内容和发布日期。

2.2 迁移数据库

创建好模型后,使用以下命令生成并应用迁移文件,将模型同步到数据库:

python manage.py makemigrations
python manage.py migrate

第一个命令会生成数据库迁移文件,第二个命令会将迁移应用到数据库,创建相应的表。


3. Django ORM 查询基础

Django ORM 提供了强大的查询功能,你可以通过它来执行 SQL 查询的各类操作,包括插入数据、更新数据、删除数据以及数据查询。

3.1 获取所有对象

使用 Model.objects.all() 可以查询模型对应的数据库表中的所有记录。例如,查询所有文章:

from myapp.models import Article

articles = Article.objects.all()
for article in articles:
    print(article.title)

这会返回所有 Article 表中的记录,并输出每篇文章的标题。


4. 单表实例的创建、读取、更新和删除 (CRUD)

Django ORM 的核心操作是对数据库的增删改查(CRUD)操作。我们将以 Article 模型为例,演示如何创建、读取、更新和删除数据库中的记录。

4.1 创建(Create)

要在数据库中插入新的记录,使用模型的构造函数或 create() 方法。例如,创建一篇新的文章:

# 使用构造函数创建实例
article = Article(title="Django ORM", content="Django ORM 是强大的数据库工具")
article.save()  # 保存到数据库

# 使用 create() 方法
article = Article.objects.create(title="Django ORM", content="Django ORM 是强大的数据库工具")

这里,save() 会将模型实例的数据保存到数据库,而 create() 会创建并保存一条新记录。

4.2 读取(Read)

要从数据库中读取记录,可以使用 objects.all() 获取所有记录,或使用 objects.filter()objects.get() 进行更具体的查询。

# 获取所有文章
articles = Article.objects.all()

# 根据条件过滤文章
article = Article.objects.filter(title="Django ORM")

# 获取符合条件的单个文章
article = Article.objects.get(id=1)  # 根据 ID 获取单个文章

filter() 返回一个查询集,支持链式调用;get() 返回唯一的一条记录,如果没有找到或找到多条记录会引发异常。

4.3 更新(Update)

要更新已有的记录,首先获取该记录的实例,然后修改其字段值,最后调用 save() 方法保存修改。

article = Article.objects.get(id=1)
article.title = "更新后的标题"
article.save()

4.4 删除(Delete)

要删除记录,使用 delete() 方法。可以删除单个实例或多个实例。

# 删除单个记录
article = Article.objects.get(id=1)
article.delete()

# 删除符合条件的所有记录
Article.objects.filter(title="Django ORM").delete()


5. 使用查询集过滤数据

Django ORM 提供了强大的过滤功能,可以根据条件进行数据过滤、排序等操作。常见的过滤方法包括:

5.1 filter()

filter() 方法用于根据给定条件筛选记录。它返回一个查询集,可以使用链式调用进行多条件筛选。

# 获取标题为 'Django ORM' 的文章
articles = Article.objects.filter(title="Django ORM")

# 获取发布时间在某个时间段内的文章
from datetime import datetime
articles = Article.objects.filter(published_date__gte=datetime(2021, 1, 1))

5.2 exclude()

exclude() 方法用于排除满足某条件的记录。

# 排除标题为 'Django ORM' 的文章
articles = Article.objects.exclude(title="Django ORM")

5.3 order_by()

order_by() 方法用于对查询结果进行排序。可以使用 - 符号指定降序排序。

# 按发布时间降序排列
articles = Article.objects.all().order_by('-published_date')

5.4 distinct()

distinct() 方法用于去重结果。

# 去除重复的标题
articles = Article.objects.values('title').distinct()


6. 常见问题与解决方案

1. get() 返回多个对象

  • 使用 get() 时,Django 假定查询条件唯一,如果查询结果返回多个对象,将抛出 MultipleObjectsReturned 异常。此时,可以使用 filter() 替代 get(),返回查询集。

2. 更新未保存实例

  • 在修改实例数据后,必须调用 save() 方法来保存更改,否则数据不会写入数据库。

3. 查询性能问题

  • 查询数据库时,尽量使用 filter() 代替 all(),避免加载大量无关数据。如果只需要某些字段,可以使用 values()values_list() 来提高性能。

7. 参考资料

出站链接

站内链接