Django学习笔记二:数据库操作详解

Django框架提供了一个功能强大的ORM(对象关系映射)系统,使得开发者可以使用Python代码来操作数据库,而无需编写复杂的SQL语句。以下是Django数据库操作的一些基本概念和方法:

模型定义

在Django中,模型是对数据库表的抽象。每个模型都是一个Python类,继承自django.db.models.Model。模型中的每个属性都对应数据库表中的一个字段。

python 复制代码
from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField(auto_now_add=True)

数据库迁移

当你定义或修改了模型后,需要创建迁移文件,并将这些变更应用到数据库中。

  • 创建迁移文件:

    复制代码
    python manage.py makemigrations
  • 应用迁移到数据库:

    复制代码
    python manage.py migrate

CRUD操作

  • 创建 :创建一个新的记录。

    python 复制代码
    blog = Blog(title='My first blog', content='This is my first blog post.')
    blog.save()
  • 读取 :查询数据库中的记录。

    python 复制代码
    blogs = Blog.objects.all()  # 获取所有记录
    blog = Blog.objects.get(id=1)  # 获取特定记录
  • 更新 :修改已存在的记录。

    python 复制代码
    blog = Blog.objects.get(id=1)
    blog.title = 'My updated blog'
    blog.save()
  • 删除 :删除记录。

    python 复制代码
    blog = Blog.objects.get(id=1)
    blog.delete()

查询集(QuerySet)

QuerySet是Django ORM返回的一种数据结构,用于表示数据库查询的结果集。它支持链式调用,可以进行过滤、排序、限制等操作。

  • 过滤:

    python 复制代码
    blogs = Blog.objects.filter(title__contains='Django')
  • 排除:

    python 复制代码
    blogs = Blog.objects.exclude(is_published=False)
  • 排序:

    python 复制代码
    blogs = Blog.objects.order_by('pub_date')
  • 限制:

    python 复制代码
    blogs = Blog.objects.all()[:10]  # 获取前10条记录

复杂查询

Django ORM支持更复杂的查询操作,如关联查询、聚合查询等。

  • 关联查询:

    python 复制代码
    from django.db.models import Count
    author_count = Author.objects.annotate(book_count=Count('book')).filter(book_count__gt=1)
  • 聚合查询:

    python 复制代码
    from django.db.models import Avg
    average_book_count = Author.objects.aggregate(avg_books=Avg('book__count'))

使用原生SQL

虽然Django ORM非常强大,但在某些情况下,你可能需要执行原生SQL语句。

  • 使用raw()方法:

    python 复制代码
    blogs = Blog.objects.raw('SELECT * FROM myapp_blog WHERE title LIKE "%Django%"')
  • 使用cursor()方法:

    python 复制代码
    from django.db import connection
    with connection.cursor() as cursor:
        cursor.execute('SELECT * FROM myapp_blog WHERE title LIKE %s', ['%Django%'])
        blogs = cursor.fetchall()

注意事项

  • 尽量使用Django ORM提供的抽象方法来操作数据库,这样可以保证代码的可读性和数据库的兼容性。
  • 当使用原生SQL时,需要特别注意SQL注入的风险。
  • 在进行数据库操作时,应该注意异常处理,避免因为数据库操作导致程序崩溃。

以上是Django数据库操作的一些基本概念和方法,更多详细信息可以参考Django的官方文档。

相关推荐
随风飘的云11 小时前
MySQL的慢查询优化解决思路
数据库
IvorySQL15 小时前
PostgreSQL 技术日报 (3月7日)|生态更新与内核性能讨论
数据库·postgresql·开源
赵渝强老师16 小时前
【赵渝强老师】金仓数据库的数据文件
数据库·国产数据库·kingbase·金仓数据库
随逸17719 小时前
《Milvus向量数据库从入门到实战,手把手搭建语义检索系统》
数据库
神秘的猪头20 小时前
🚀 React 开发者进阶:RAG 核心——手把手带你玩转 Milvus 向量数据库
数据库·后端·llm
IvorySQL2 天前
PostgreSQL 技术日报 (3月6日)|为什么 Ctrl-C 在 psql 里让人不安?
数据库·postgresql·开源
NineData2 天前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库
IvorySQL2 天前
PostgreSQL 技术日报 (3月5日)|规划器控制力升级,内核能力再进阶
数据库·postgresql·开源
数据组小组2 天前
免费数据库管理工具深度横评:NineData 社区版、Bytebase 社区版、Archery,2026 年开发者该选哪个?
数据库·测试·数据库管理工具·数据复制·迁移工具·ninedata社区版·naivicat平替