You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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格式),可以通过一条命令导入数据库:

  1. 在你的应用下创建fixtures目录(比如library/fixtures/)。
  2. 创建一个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
            }
        }
    ]
    
  3. 运行命令将数据导入数据库:
    python manage.py loaddata books.json
    

方法3:通过迁移文件插入数据

你可以创建一个数据迁移,让数据插入操作成为项目迁移流程的一部分,适合需要随项目初始化自动填充的数据:

  1. 为应用创建一个空的迁移文件:
    python manage.py makemigrations --empty library
    
  2. 打开生成的迁移文件(在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),
        ]
    
  3. 运行迁移命令完成数据插入:
    python manage.py migrate
    

方法4:直接编辑SQLite数据库

你可以用SQLite工具(比如sqlite3命令行工具或DB Browser for SQLite可视化工具)打开项目中的db.sqlite3文件,直接执行INSERT语句。注意要确保字段和模型定义一致(包括自动生成的字段如id,如果不想让SQLite自动处理的话)。不过这种方式会跳过Django ORM的验证,建议谨慎使用。

内容的提问来源于stack exchange,提问作者cavalcantelucas

火山引擎 最新活动