Django框架提供了一个功能强大的ORM(对象关系映射)系统,使得开发者可以使用Python代码来操作数据库,而无需编写复杂的SQL语句。以下是Django数据库操作的一些基本概念和方法:
模型定义
在Django中,模型是对数据库表的抽象。每个模型都是一个Python类,继承自django.db.models.Model
。模型中的每个属性都对应数据库表中的一个字段。
from django.db import modelsclass 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操作
- 创建:创建一个新的记录。
blog = Blog(title='My first blog', content='This is my first blog post.') blog.save()
- 读取:查询数据库中的记录。
blogs = Blog.objects.all() # 获取所有记录 blog = Blog.objects.get(id=1) # 获取特定记录
- 更新:修改已存在的记录。
blog = Blog.objects.get(id=1) blog.title = 'My updated blog' blog.save()
- 删除:删除记录。
blog = Blog.objects.get(id=1) blog.delete()
查询集(QuerySet)
QuerySet是Django ORM返回的一种数据结构,用于表示数据库查询的结果集。它支持链式调用,可以进行过滤、排序、限制等操作。
- 过滤:
blogs = Blog.objects.filter(title__contains='Django')
- 排除:
blogs = Blog.objects.exclude(is_published=False)
- 排序:
blogs = Blog.objects.order_by('pub_date')
- 限制:
blogs = Blog.objects.all()[:10] # 获取前10条记录
复杂查询
Django ORM支持更复杂的查询操作,如关联查询、聚合查询等。
- 关联查询:
from django.db.models import Count author_count = Author.objects.annotate(book_count=Count('book')).filter(book_count__gt=1)
- 聚合查询:
from django.db.models import Avg average_book_count = Author.objects.aggregate(avg_books=Avg('book__count'))
使用原生SQL
虽然Django ORM非常强大,但在某些情况下,你可能需要执行原生SQL语句。
- 使用
raw()
方法:blogs = Blog.objects.raw('SELECT * FROM myapp_blog WHERE title LIKE "%Django%"')
- 使用
cursor()
方法: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的官方文档。