文章目录
- 1、Django 模型简介
- 2、Django 中创建并使用模型
- (1)新加一个名为 myapp 的应用
- (2)定义模型类
- (2)激活模型类
- (3)创建数据库迁移文件
- (4)应用迁移文件
- 3、验证数据库是否生成了`myapp_personinfo`表
- 4、疑问一:为什么创建出来的表是`myapp_personinfo`而不是`PersonInfo`或其他情况呢?
- 5、疑问二、为什么查询出来的表结构多出了一个`id`列呢?
1、Django 模型简介
在Django框架中,模型(Model)用于与数据库进行交互,实现ORM(对象关系映射)。
Django的ORM系统支持多种数据库,包括PostgreSQL、SQLite、MySQL、MariaDB和Oracle,为不同数据库提供了统一的API接口。模型**通常(有特例)**映射到数据库中的一张表,模型字段对应表的列,并在业务逻辑层与数据库之间构建桥梁。
Django将数据库配置集中在settings.py
中,而models.py
文件则仅关注业务逻辑,使得模型代码更加简洁且与数据库类型解耦。Django模型的每个类继承自django.db.models.Model
,其属性对应数据库字段。
通过Django ORM,开发者可以将Python中的对象映射并持久化到数据库中,从而方便地管理数据。
2、Django 中创建并使用模型
前言:这里我们使用django默认支持的SQLite 数据库,无需配置setting.py 即可直接使用。
(1)新加一个名为 myapp 的应用
-
在命令行运行如下命令
python manage.py startapp myapp
-
django 默认已经在myapp目录下给你创建了
models.py
文件,如图:
(2)定义模型类
-
操作:在应用的
models.py
文件中定义模型类(如PersonInfo
),并继承models.Model
-
示例:
from django.db import models class PersonInfo(models.Model): name = models.CharField(max_length=50) gender = models.CharField(max_length=10) age = models.IntegerField()
-
说明:
PersonInfo
模型类包含name
(姓名)、gender
(性别)和age
(年龄)三个字段,分别使用CharField
和IntegerField
定义。
(2)激活模型类
-
在项目的
settings.py
文件中,找到INSTALLED_APPS
配置项,添加模型所在的应用(myapp
),以激活myapp/models.py
文件内的模型类 -
示例:
INSTALLED_APPS = [ ..., 'myapp', ]
(3)创建数据库迁移文件
-
在命令行中运行以下命令来生成迁移文件
python manage.py makemigrations
-
说明:此步骤会生成用于创建数据库表的迁移文件,放置在
应用名/migrations目录下
,这里是myapp/migrations
:如图:
(4)应用迁移文件
-
在命令行中运行如下命令,将迁移文件应用到数据库,将创建/更新数据库中的表
python manage.py migrate
-
说明:这一步会在数据库中生成
myapp_personinfo
表。
这四个步骤完成后,Django模型已成功定义并在数据库中生成相应的表,可以通过Django ORM进行数据操作。
3、验证数据库是否生成了myapp_personinfo
表
前言:
python manage.py migrate
该命令执行后,项目根路径下的db.sqlite3文件将更新;
-
命令行输入以下命令进入 SQLite 控制台:
sqlite3 db.sqlite3
-
使用下列 任意命令之一查询当前数据库的所有表信息:
-- 方式一 .tables -- 方式二 SELECT name FROM sqlite_master WHERE type='table';
结果如图:
-
验证新建表
myapp_personinfo
的表结构,运行下列sql语句PRAGMA table_info(myapp_personinfo);
结果如图:
4、疑问一:为什么创建出来的表是myapp_personinfo
而不是PersonInfo
或其他情况呢?
在 Django 中,表的名称通常是根据应用名称和模型名称自动生成的,以确保命名唯一性,避免不同应用中的模型名称冲突。
(1)命名规则
Django 默认使用以下规则创建表名:
<应用名称>_<模型名称小写>
因此,如果模型 PersonInfo
定义在应用 myapp
中,那么 Django 会将表名生成为 myapp_personinfo
。这种命名方式有助于组织数据库表,避免命名冲突。
(2)自定义表名
如果不想使用默认的命名规则,可以在模型的 Meta
类中指定 db_table
属性来自定义表名:
from django.db import models
class PersonInfo(models.Model):
name = models.CharField(max_length=50)
gender = models.CharField(max_length=10)
age = models.IntegerField()
class Meta:
db_table = 'person_info' # 自定义表名
这样,Django 会在数据库中创建 person_info
表,而不是默认的 myapp_personinfo
。
后续会讲到**Meta
**相关内容,敬请期待。。
5、疑问二、为什么查询出来的表结构多出了一个id
列呢?
如果没有手动定义主键,Django 会自动在模型中添加一个 id
字段,它是一个自增的整数列,用于唯一标识每一行记录,以方便Django进行数据库操作。
当然通过自定义主键字段,可以去掉这个自动生成的 id
列,但一般建议使用Django生成的默认主键!!
-
自定义主键字段:如果不想使用自动生成的
id
,可以在模型中定义自己的主键字段。比如:from django.db import models class PersonInfo(models.Model): person_id = models.CharField(max_length=10, primary_key=True) # 自定义主键 name = models.CharField(max_length=50) gender = models.CharField(max_length=10) age = models.IntegerField()
这样定义后,
id
列将不会再自动添加,person_id
将作为主键使用。