当前位置: 首页 > news >正文

05 Django 框架模型介绍(一)

文章目录

      • 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 modelsclass PersonInfo(models.Model):name = models.CharField(max_length=50)gender = models.CharField(max_length=10)age = models.IntegerField()
    
  • 说明PersonInfo模型类包含name(姓名)、gender(性别)和age(年龄)三个字段,分别使用CharFieldIntegerField定义。

(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 modelsclass 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 modelsclass 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 将作为主键使用。


http://www.mrgr.cn/news/64449.html

相关文章:

  • redis:list列表命令和内部编码
  • 软件设计师-上午题-14 信息安全(5分)
  • Android编译环境构建(二)(可用于物理机、虚拟机、容器化Jenkins环境)
  • 远程控制项目第二天
  • 【golang/navmesh】使用recast navigation进行寻路
  • FFMPEG录屏(21)--- Linux 下基于X11枚举所有可见窗口,并获取标题、图标、缩略图、进程路径等信息
  • 虚拟机安装Ubuntu系统
  • 网络请求优化:理论与实践
  • 【Python项目管理】“无法创建虚拟环境”报错原因及解决方法
  • JZ2440开发板——LCD
  • 什么是软件测试?软件测试的流程?软件测试未来3-5年的职业规划?
  • 【AD】1-2 AD24软件的中英文版本切换
  • Python数据分析案例62——基于MAGU-LSTM的时间序列预测(记忆增强门控单元)
  • 不同网线类型
  • 数据库->联合查询
  • Ubuntu使用Qt虚拟键盘,支持中英文切换
  • 网鼎杯-re2-好久不见5
  • C语言 ——— 学习和使用 strstr 函数,并模拟实现
  • [Redis] Redis事务
  • 高频电子线路---一文读懂调幅
  • Ubuntu - 进入紧急模式,无法进入桌面
  • [RootersCTF2019]ImgXweb
  • Golang--DOS命令、变量、基本数据类型、标识符
  • 图文深入介绍Oracle DB link(二)
  • 【资调实习报告】华中农业大学资源调查与评价实习报告
  • 信息学奥赛一本通 1394:连接格点(grid)