05 Django 框架模型介绍(一)

news2024/11/5 16:40:19

文章目录

      • 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(年龄)三个字段,分别使用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 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 将作为主键使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2230886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Autosar CP中的I/O硬件抽象层功能与接口使用导读

规范的主要内容 I/O硬件抽象层&#xff08;I/O Hardware Abstraction Layer&#xff0c;简称IoHwAb&#xff09;的主要功能包括以下几点&#xff1a; 提供硬件访问接口&#xff1a;I/O硬件抽象层为上层软件组件&#xff08;如应用层软件&#xff09;提供访问微控制器硬件&…

【毫米波雷达(三)】汽车控制器启动流程——BootLoader

汽车控制器启动流程——BootLoader 一、什么是Bootloader(BT)&#xff1f;二、FBL、PBL、SBL、ESS的区别三、MCU的 A/B分区的实现 一、什么是Bootloader(BT)&#xff1f; BT就是一段程序&#xff0c;一段引导程序。它包含了启动代码、中断、主程序等。 雷达启动需要由BT跳转到…

初始JavaEE篇——多线程(8):JUC的组件

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 Callable接口 ReentrantLock synchronized 与 ReentrantLock的区别 信号量&#xff08;Semaphore&#xff09; CountDown…

Vue3+Data-V实现可视化大屏页面布局

目录 一、前言 二、环境准备 1.Vue3安装npm create vuelatest 2.Data-V配置 项目Data-v安装 main.js中注册Data-v到全局 ​编辑可使用按需引入 3.测试 三、导航栏路由跳转配置 1.子组件mainNav组件准备 2.父组件准备导航栏参数传递 3.子组件接收父组件参数 4.导航…

Solana 代币 2022 — Transfer Hook

从零到英雄的 Solana 代币 2022 — Transfer Hook Token 2022 计划引入了几项令人兴奋的扩展&#xff0c;增强了铸造和代币账户的功能。在这些功能中&#xff0c;我个人最喜欢的是Transfer Hook &#xff08;转账钩子&#xff09; 。 想象时间 让我们戴上想象的帽子&#xf…

Edge浏览器设置优化

依次点击右上角的三个点-“设置”。 在“外观”设置项中&#xff0c;关闭“显示选项卡操作菜单”、“在垂直选项卡中隐藏标题栏”、“在标题栏中显示个人资料图标”&#xff0c;选择“不显示独立搜索框”。 在“选择要在工具栏上显示的按钮”&#xff0c;开启“下载按钮”。 重…

电脑软件:推荐一款免费且实用的电脑开关机小工具

目录 一、软件简介 二、软件功能 三、软件特点 四、使用说明 五、软件下载 今天给大家推荐一款免费且实用的电脑开关机小工具KShutdown&#xff0c;有需要的朋友可以下载试一下&#xff01; 一、软件简介 KShutdown是一款精巧且实用的定时自动关机小工具&#xff0c;对于…

Python Matplotlib 子图绘制

Python 中的子图绘制 在数据可视化中&#xff0c;展示多个图表在同一个画布上是常见的需求&#xff0c;这样可以更直观地比较不同数据集之间的关系。Python 中的 Matplotlib 库为我们提供了强大的功能来实现这一点。在本篇文章中&#xff0c;我们将详细介绍如何使用 Matplotli…

透明加密技术是什么?透明加密技术的原理与应用实践(内含代表性软件分享)

触目惊心&#xff01;10大典型间谍案例回顾 张某离职前搜集大量文件资料&#xff0c;甚至拆开电脑主机拷贝文件 私自存有5200份文件资料 其中标注绝密级的59份 机密级848份 秘密级541份 在当今这个信息化高速发展的时代&#xff0c;透明加密技术已不容忽视。那么&#xff…

rhce:web服务器

web服务器简介 服务器端&#xff1a;此处使用 nginx 提供 web 服务&#xff0c; RPM 包获取&#xff1a; http://nginx.org/packages/ /etc/nginx/ ├── conf.d #子配置文件目录 ├── default.d ├── fastcgi.conf ├── fastcgi.conf.default ├── fastcgi_params #用…

后端:Spring、Spring Boot-实例化Bean依赖注入(DI)

文章目录 1. 实例化Bean2. 使用FactoryBean3. 依赖注入(DI)3.1 AutoWired 属性注入(查找顺序&#xff1a;先类型&#xff0c;后名字)3.2 AutoWired 在构造函数&参数上的使用3.3 Inject和Resource 进行依赖注入3.4 Value 进行注入 1. 实例化Bean 默认使用无参构造函数&…

Android——横屏竖屏

系统配置变更的处理机制 为了避免横竖屏切换时重新加载界面的情况&#xff0c;Android设计了一中配置变更机制&#xff0c;在指定的环境配置发生变更之时&#xff0c;无需重启活动页面&#xff0c;只需执行特定的变更行为。该机制的视线过程分为两步&#xff1a; 修改 Androi…

ubuntu openmpi安装(超简单)

openmpi安装 apt update apt install openmpi-bin openmpi-common libopenmpi-dev安装到此完毕 测试一下&#xff0c;success !

基于DCT的数字水印算法

摘要 数字水印技术近年来得到了较大的发展&#xff0c;基于变换域的水印技术是目前研究的热点。数字水印是利用数字作品中普遍存在的冗余数据和随机性&#xff0c;把标识版权的水印信息嵌入到数字作品中&#xff0c;从而可以起到保护数字作品的版权或其完整性的一种技术。 一个…

【Linux指令】---获取进程的PID

获取进程的PID getpid()函数

李红《复变函数与积分变换》第五版课后习题答案PDF

《复变函数与积分变换(第五版)学习辅导与习题全解》是与《复变函数与积分变换(第五版)》(华中科技大学数学与统计学院)配套的学习辅导书&#xff0c; 全书共八章&#xff1a;复数与复变函数&#xff0c; 解析函数&#xff0c;复变函数的积分&#xff0c; 解析函数的级数表示&am…

Zypher Network:全栈式 Web3 游戏引擎,服务器抽象叙事的引领者

近期&#xff0c;《黑神话&#xff1a;悟空》的爆火不仅让 AAA 游戏重回焦点&#xff0c;也引发了玩家与开发者的热议。Web2 游戏的持续成功导致部分 Web3 玩家们的倒戈&#xff0c;对比之下 Web3 游戏存在生命周期短且商业模式难以明确的问题&#xff0c;尤其在当前加密市场环…

【Linux】利用 <信号量> 实现 <生产者-消费者模型-线程同步 >(思维导图&代码演示&思路解析)

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

「Mac畅玩鸿蒙与硬件20」鸿蒙UI组件篇10 - Canvas 组件自定义绘图

Canvas 组件在鸿蒙应用中用于绘制自定义图形,提供丰富的绘制功能和灵活的定制能力。通过 Canvas,可以创建矩形、圆形、路径、文本等基础图形,为鸿蒙应用增添个性化的视觉效果。本篇将介绍 Canvas 组件的基础操作,涵盖绘制矩形、圆形、路径和文本的实例。 关键词 Canvas 组件…

spark-on-k8s 介绍

spark-on-k8s 介绍 摘要 最近一段时间都在做与spark相关的项目&#xff0c;主要是与最近今年比较火的隐私计算相结合&#xff0c;主要是在机密计算领域使用spark做大数据分析、SQL等业务&#xff0c;从中也了解到了一些spark的知识&#xff0c;现在做一个简单的总结&#xff…