如何在Django中手动查询数据库及创建模型时插入初始数据?
1. 如何在Django框架中手动对数据库执行查询操作?
针对这个需求,有几种直观的方式,取决于你更倾向于用Django原生的ORM(推荐)还是直接写原生SQL:
通过Django Shell使用ORM
这是最贴合Django生态的方式,不需要直接编写SQL:
- 首先在项目根目录运行命令启动Django Shell:
python manage.py shell - 导入你要操作的模型,比如你在名为
library的应用里有个Book模型:from library.models import Book - 接下来就能执行各类查询操作了:
- 获取所有记录:
Book.objects.all() - 按条件过滤记录:
Book.objects.filter(author="J.K.罗琳") - 通过主键获取单条记录:
Book.objects.get(id=1) - 创建新记录:
new_book = Book(title="哈利波特与魔法石", author="J.K.罗琳", publication_year=1997) new_book.save() - 更新已有记录:
book = Book.objects.get(id=1) book.publication_year = 1998 book.save() - 删除记录:
Book.objects.get(id=1).delete()
- 获取所有记录:
使用原生SQL
如果需要执行ORM难以处理的复杂查询,可以直接用原生SQL:
结合模型对象的原生查询
你可以用原生SQL获取模型实例:
from library.models import Book books = Book.objects.raw("SELECT * FROM library_book WHERE author = %s", ["J.K.罗琳"]) for book in books: print(book.title)
直接操作数据库连接
如果要执行完全脱离模型的原生SQL(比如独立的INSERT/UPDATE),可以用Django的数据库连接:
from django.db import connection with connection.cursor() as cursor: # 执行INSERT语句 cursor.execute("INSERT INTO library_book (title, author, publication_year) VALUES (%s, %s, %s)", ("神奇动物在哪里", "J.K.罗琳", 2001)) # 执行SELECT语句并获取结果 cursor.execute("SELECT title FROM library_book WHERE author = %s", ["J.K.罗琳"]) results = cursor.fetchall() for row in results: print(row[0])
2. 创建models.Model类时,是否可手动向默认SQLite数据库插入数据?
当然可以!你完全不用每次都通过/admin页面手动录入数据,有几种实用的方法:
方法1:通过Django Shell手动插入
就像上面查询操作的例子一样,你可以直接在Django Shell里创建模型实例并保存,适合快速的一次性插入。
方法2:使用Django Fixtures(数据夹具)
Fixtures是静态数据文件(JSON、YAML或XML格式),可以通过一条命令导入数据库:
- 在你的应用下创建
fixtures目录(比如library/fixtures/)。 - 创建一个JSON文件(比如
books.json),写入要插入的数据:[ { "model": "library.book", "pk": 1, "fields": { "title": "哈利波特与密室", "author": "J.K.罗琳", "publication_year": 1998 } }, { "model": "library.book", "pk": 2, "fields": { "title": "哈利波特与阿兹卡班的囚徒", "author": "J.K.罗琳", "publication_year": 1999 } } ] - 运行命令将数据导入数据库:
python manage.py loaddata books.json
方法3:通过迁移文件插入数据
你可以创建一个数据迁移,让数据插入操作成为项目迁移流程的一部分,适合需要随项目初始化自动填充的数据:
- 为应用创建一个空的迁移文件:
python manage.py makemigrations --empty library - 打开生成的迁移文件(在
library/migrations/目录下),修改为包含RunPython操作:from django.db import migrations def add_initial_books(apps, schema_editor): # 不能直接导入Book模型,因为可能存在版本差异,需通过apps获取 Book = apps.get_model('library', 'Book') Book.objects.create(title="哈利波特与火焰杯", author="J.K.罗琳", publication_year=2000) Book.objects.create(title="哈利波特与凤凰社", author="J.K.罗琳", publication_year=2003) class Migration(migrations.Migration): dependencies = [ # 依赖你的模型初始迁移文件(比如'library.0001_initial') ('library', '0001_initial'), ] operations = [ migrations.RunPython(add_initial_books), ] - 运行迁移命令完成数据插入:
python manage.py migrate
方法4:直接编辑SQLite数据库
你可以用SQLite工具(比如sqlite3命令行工具或DB Browser for SQLite可视化工具)打开项目中的db.sqlite3文件,直接执行INSERT语句。注意要确保字段和模型定义一致(包括自动生成的字段如id,如果不想让SQLite自动处理的话)。不过这种方式会跳过Django ORM的验证,建议谨慎使用。
内容的提问来源于stack exchange,提问作者cavalcantelucas




