太原网站排名外包,开滦建设集团网站,wordpress pods插件,北京宏福建设有限公司网站本文关键词#xff1a;Python、Django、ORM。 概要
在 Python Web 开发中#xff0c;ORM#xff08;Object-Relational Mapping#xff0c;对象关系映射#xff09;是一个非常重要的概念。ORM 框架可以让我们不用编写 SQL 语句#xff0c;就能够使用对象的方式来操作数据… 本文关键词Python、Django、ORM。 概要
在 Python Web 开发中ORMObject-Relational Mapping对象关系映射是一个非常重要的概念。ORM 框架可以让我们不用编写 SQL 语句就能够使用对象的方式来操作数据库大大提高了代码的可读性和可维护性。Django 作为一款流行的 Web 框架自带了强大的 ORM 框架。
本文将会详细介绍 Django 的 ORM 框架包括基本使用方法、高级查询、性能优化等方面。 1. 基本使用方法
1.1 定义模型类
在 Django 里可以使用模型类来定义数据库表。模型类需要继承自 django.db.models.Model并且定义表的各个字段。例如下面是一个简单的模型类用来表示一个博客文章
from django.db import modelsclass Blog(models.Model):title models.CharField(max_length100)content models.TextField()pub_date models.DateTimeField(auto_now_addTrue)上面的代码定义了一个 Blog 类来表示博客文章。这个类继承自 django.db.models.Model并且定义了三个字段标题、内容和发布日期。其中标题和内容都是字符串类型使用 CharField 和 TextField 来定义。pub_date 是一个日期时间类型使用 DateTimeField 来定义。auto_now_addTrue 表示在创建新记录时自动设置为当前时间。
1.2 创建表
定义完模型类之后我们需要创建对应的数据库表。在 Django 中可以使用 manage.py 命令来进行数据库迁移操作。具体来说我们需要执行以下两个命令
# 生成迁移文件
python manage.py makemigrations# 执行迁移操作
python manage.py migrate执行完上面的两个命令之后Django 会根据模型类自动生成对应的数据库表。 注意在进行迁移操作之前请确保已经仔细确认了所有相关设置和代码并且备份了数据。 1.3 插入数据
插入数据可以使用模型类来表示一条记录并且调用 save() 方法来将记录保存到数据库中。例如下面的代码演示了如何向 Blog 表中插入一条记录
blog Blog(titleHello World, contentThis is my first blog post.)
blog.save()1.4 查询数据
查询数据可以使用模型类的 objects 属性该属性是 Manager 类的实例提供了各种查询方法。例如从 Blog 表中查询所有记录
blogs Blog.objects.all()for blog in blogs:print(blog.title, blog.content, blog.pub_date)1.5 更新数据
更新数据可以先查询出需要更新的记录然后修改对应的字段最后调用 save() 方法进行保存。例如将 Blog 表中所有记录的标题修改为 Hello Django
blogs Blog.objects.all()for blog in blogs:blog.title Hello Djangoblog.save()1.6 删除数据
删除数据可以先查询出需要删除的记录然后调用 delete() 方法进行删除。例如删除 Blog 表中所有记录
blogs Blog.objects.all()for blog in blogs:blog.delete()2. 高级查询
2.1 条件查询
Django 的 ORM 框架提供了非常方便的条件查询功能。例如查询 Blog 表中标题为 Hello World 的记录
blogs Blog.objects.filter(titleHello World)for blog in blogs:print(blog.title, blog.content,blog.pub_date)可以看到我们使用了 filter() 方法来指定查询条件其中 titleHello World 表示标题等于 Hello World。filter() 方法返回一个 QuerySet 对象可以使用 for 循环遍历查询结果。
2.2 聚合查询
聚合查询可以使用 aggregate() 方法来实现。例如统计 Blog 表中记录的数量
from django.db.models import Countcount Blog.objects.aggregate(Count(id))
print(count[id__count])可以看到我们使用了 aggregate() 方法来指定聚合操作其中 Count(id) 表示统计 id 字段的数量。aggregate() 方法返回一个字典其中键是聚合操作的名称例如id__count 表示统计数量值是聚合操作的结果。
2.3 连接查询
连接查询可以使用 select_related() 方法和 prefetch_related() 方法来实现。例如下面的代码演示了如何查询 Blog 表中的记录并且同时连接查询关联的 Author 表中的作者信息
class Author(models.Model):name models.CharField(max_length50)class Blog(models.Model):title models.CharField(max_length100)content models.TextField()pub_date models.DateTimeField(auto_now_addTrue)author models.ForeignKey(Author, on_deletemodels.CASCADE)blogs Blog.objects.select_related(author)for blog in blogs:print(blog.title, blog.content, blog.pub_date, blog.author.name)可以看到我们使用了 select_related(author) 方法来指定需要连接查询的外键字段即 author 字段这样就可以同时查询 Blog 表和 Author 表中的数据。注意select_related() 方法只能用于一对一和多对一关系的查询上面的例子是多对一关系。
2.4 原生 SQL 查询
Django 的 ORM 框架也支持原生 SQL 查询。例如使用原生 SQL 查询 Blog 表中的记录
from django.db import connectionwith connection.cursor() as cursor:cursor.execute(SELECT * FROM myapp_blog)blogs cursor.fetchall()for blog in blogs:print(blog[1], blog[2], blog[3])可以看到我们使用了 connection.cursor() 方法来获取数据库连接的游标然后调用 execute() 方法执行 SQL 查询。最后使用 fetchall() 方法获取查询结果。 3. 性能优化
3.1 使用索引
索引是提高数据库查询性能的重要手段。在 Django 中可以使用 db_indexTrue 参数来为字段创建索引。例如为 title 字段创建索引
class Blog(models.Model):title models.CharField(max_length100, db_indexTrue)content models.TextField()pub_date models.DateTimeField(auto_now_addTrue)3.2 批量操作
批量操作可以使用 bulk_create() 方法和 bulk_update() 方法来实现。例如下面的代码演示了如何批量插入 Blog 表中的记录
blogs [Blog(titleBlog 1, contentContent 1),Blog(titleBlog 2, contentContent 2),Blog(titleBlog 3, contentContent 3),
]Blog.objects.bulk_create(blogs)可以看到我们使用了 bulk_create() 方法来批量插入记录其中 blogs 是一个包含多个 Blog 实例的列表。
3.3 延迟加载
延迟加载可以使用 defer() 方法和 only() 方法来实现。
使用 defer() 方法时Django 将不会立即从数据库中获取指定字段的数据。它会在需要访问这些字段的数据时再去查询数据库。这样可以避免一次性从数据库中取出大量的数据减轻数据库的负担提高查询效率。
使用 only() 方法可以指定只查询需要的字段而不是查询整个表的所有字段。这样可以减少数据传输的大小节省网络带宽和内存资源提高查询效率。
例如延迟加载 Blog 表中的记录并且只查询 title 和 pub_date 两个字段
blogs Blog.objects.defer(content).only(title, pub_date)for blog in blogs:print(blog.title, blog.pub_date)可以看到我们使用了 defer(content) 方法来延迟加载 content 字段这样查询结果中就不会包含 content 字段的数据。同时使用 only(title, pub_date) 方法来指定只查询 title 和 pub_date 两个字段的数据。
3.4 缓存查询结果
缓存查询结果可以使用 Django 的缓存框架来实现。Django的缓存框架可以配置为使用不同的缓存后端下面是常见的几种缓存后端的配置方法
3.4.1 内存缓存
使用内存缓存作为缓存后端是最简单的配置方式它可以快速地缓存数据并且不需要额外的配置。在settings.py文件中进行如下配置
CACHES {default: {BACKEND: django.core.cache.backends.locmem.LocMemCache,LOCATION: unique-snowflake,}
}BACKEND 指定了缓存后端为内存缓存LOCATION 是一个可选的参数用于指定缓存的名称可以是任何字符串。
3.4.2 文件缓存
使用文件缓存作为缓存后端可以将缓存数据存储到文件系统中需要指定缓存文件的路径。在settings.py文件中进行如下配置
CACHES {default: {BACKEND: django.core.cache.backends.filebased.FileBasedCache,LOCATION: /var/tmp/django_cache,}
}BACKEND 指定了缓存后端为文件缓存LOCATION 是一个必选的参数用于指定缓存文件的路径。
3.4.3 Memcached
使用Memcached作为缓存后端可以将缓存数据存储到Memcached服务器中需要指定Memcached服务器的地址和端口号。在settings.py文件中进行如下配置
CACHES {default: {BACKEND: django.core.cache.backends.memcached.MemcachedCache,LOCATION: 127.0.0.1:11211,}
}BACKEND 指定了缓存后端为MemcachedLOCATION 是一个必选的参数用于指定Memcached服务器的地址和端口号。
3.4.4 Redis
使用Redis作为缓存后端可以将缓存数据存储到Redis服务器中需要指定Redis服务器的地址、端口号和数据库编号。在settings.py文件中进行如下配置
CACHES {default: {BACKEND: django_redis.cache.RedisCache,LOCATION: redis://127.0.0.1:6379/0,OPTIONS: {CLIENT_CLASS: django_redis.client.DefaultClient,},}
}BACKEND 指定了缓存后端为RedisLOCATION 是一个必选的参数用于指定Redis服务器的地址、端口号和数据库编号。OPTIONS 是一个可选的参数用于指定Redis客户端的选项这里使用默认选项。
需要注意的是在使用Redis作为缓存后端时需要额外安装 django-redis 库。可以使用pip命令进行安装
pip install django-redis例如缓存 Blog 表中的记录
from django.core.cache import cacheblogs cache.get(blogs)if blogs is None:blogs Blog.objects.all()cache.set(blogs, blogs, timeout3600)for blog in blogs:print(blog.title, blog.content, blog.pub_date)可以看到我们使用了 cache.get(blogs) 方法来从缓存中获取查询结果。如果缓存中不存在查询结果则使用 Blog.objects.all() 来查询数据库并且使用 cache.set(blogs, blogs, timeout3600) 方法将查询结果存入缓存中。其中timeout3600 表示缓存的过期时间为 3600 秒。 技术总结
本文详细介绍了 Django 的 ORM 框架包括基本使用方法、高级查询和性能优化等方面。ORM 框架可以让我们不用编写 SQL 语句就能够使用对象的方式来操作数据库大大提高了代码的可读性和可维护性。同时我们还介绍了一些性能优化技巧例如使用索引、批量操作、延迟加载和缓存查询结果等。希望本文对你学习 Django 的 ORM 框架有所帮助 欢迎点赞收藏转发感谢