Django新手必看:如何创建应用和定义数据表。看完这一篇就够了

news2024/11/27 13:53:09

1. Django创建应用

  • Django 项目就是基于 Django 框架开发的 Web 应用,它包含了一组配置和多个应用,我们把应用称之为App,在前文中对它也做了相应的介绍,比如 auth、admin,它们都属于 APP。
  • 一个 App 就是一个 Python 包,通常一个 App 可以包含模型、视图、模板和 URL 配置文件,可以被应用到多个 Django项目中,因为它们的本质就是可被重用的 Python 软件包。

1.1 创建应用

Django 的设计目标是让开发者关注应用的功能逻辑的实现。

所以,创建应用的过程是非常简单的,利用 manage.py 提供的 startapp 命令就可以创建一个APP。

具体命令如下所示:
语法:

python manage.py startapp 应用名

python manage.py startapp index
  • startapp 同样也属于 manage.py 的子命令,用来创建 Django 的应用。

执行这个命令不会在命令行看到任何输出,但是可以在 manage.py 的同级目录下看到多出了一个 index 目录:

在这里插入图片描述

我们对这些文件做逐一的解释:

  • admin.py 用于将 Model 定义的数据表注册到管理后台,是 Django Admin 应用的配置文件
  • apps.py 用于应用程序本身的属性配置文件
  • models.py 用于定义应用中所需要的数据表
  • tests.py 文件用于编写当前应用程序的单元测试
  • views.py 用来定义视图处理函数的文件
  • 一级目录下的 __init__.py文件标识 index 应用是一个 Python 包
  • migrations 目录用于存储数据库迁移时生成的文件,该目录下的 __init__.py文件标识 migrations 是一个 Python 包

这就是 index
应用涉及到的所有文件,当然在实际的开发工作中,该应用目录下的文件也不是一成不变的,开发者根据自己的需要会相应的增加文件或者子目录,比如
urls.py 文件或者存储静态文件的 static 目录等。所以大家千万不要认为 Django
框架自动生成的目录,无需我们做其他操作或者更改,这是使用 Django 的一个误区。

1.2 应用的添加

应用创建完成后,我们还需要在 settings.py 配置文件中对其进行添加。

我们已经对 INSTALLED_APPS 做了介绍,把我们创建的应用添加到这个列表,如下所示:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'index',
]
  • 用如上方式添加完成后,就可以让 index 应用的和整个项目融为一体了。
  • 接下来,就可以正式进入开发应用阶段了,通过实现一些小的功能点,让我们更加全面的了解 Django 框架。

2. Django ORM

  • ORM (Object Realtional Mapping)即对象关系映射,它是一种基于关系型数据库的程序技术。ORM允许你使用类和对象对数据库进行操作,这大大提高了对数据库的控制,避免了直接使用 SQL语句对数据库进行操作。这种程序技术的底层主要是通过映射机制实现的,后面会讲解映射的使用!
  • Web 开发中对数据库的操作是必不可少的,然而每种数据库的操作方式以及用法不尽相同。由于 Django 中 ORM的存在,为我们操作不同种类的数据库提供了统一的方法,ORM 适配了多种常用的关系型数据库。

在这里插入图片描述

2.1 定义数据表

在定义数据表之前,我们应该首先理解什么是模型类。

  • 模型类

    其实模型类本质上属于一个 Python 类,只不过在 Django 中称之为做模型类,它是由 django.db.models.Model 派生出的子类

    通过上述介绍,我们可以这样理解:Django 中模型类就相当于 ORM 模块。

  • 定义数据表

    现在有一张用户信息表 UserInfo,它有两个字段 name 和 password,可以定义如下:

    from django.db import models
    class UserInfo(models.Model):
        name = models.CharFiled(max_length=100)
        password = models.CharFiled(max_length=100)
    

通过以上代码,UserInfo 数据表就已经创建完成,我们对代码进行逐行解析:

  • 第 1 行,使用 from django.db import models 导入 models 模块

  • 第 2 行,使用 class 关键字对 UserInfo 表进行类定义,并继承了models 模块中的 Model 类

  • 第3、4 行,数据表中的字段 name 和 password 是 UserInfo 类的属性,name 和 password 字段类型都是 CharFiled,字段长度均是100。

2.2 定义项目数据表

下面我们用 ORM 定义 index 应用所需的数据表,首选找到 index 应用下的 models.py 文件。

在文件里添加如下代码:

from django.db import models

# Create your models here.

# 创建book表
class Book(models.Model):
    title = models.CharField(max_length=30, unique=True, verbose_name='书名')
    public = models.CharField(max_length=50, verbose_name='出版社')
    price = models.DecimalField(max_digits=7, decimal_places=2, verbose_name='定价')
    retail_price = models.DecimalField(max_digits=7, decimal_places=2, verbose_name='零售价', default="30")

# 创建作者表
class Author(models.Model):  
    name = models.CharField(max_length=30, verbose_name='姓名')
    email = models.EmailField(verbose_name='邮箱')

# 创建用户信息表
class UserInfo(models.Model): 
    username = models.CharField(max_length=24, verbose_name='用户注册')
    password = models.CharField(max_length=24, verbose_name='密码')

  • 通过上述代码,我们定义了一个名叫 Book 的数据表。
  • 数据表由以下字段构成书名(title)、出版社(public)、价格(price)、零售价(retail_price),而且对每个字段都做添加了相应的字段属性以及字段选项。

为什么表中没有设置主键呢,当定义一个模型类时,Django会自动创建一个主键字段,该字段名为id,类型为AutoField,其自增长。

也可以手动创建

id = models.AutoField(primary_key=True) # id 会自动创建,可以手动写入

2.3 通用字段选项

Model 中添加的字段都是 Field 类型的实例,不同的 Field 类型可能会支持不同的字段选项,但是也有很多字段选项是通用的,即可以用在任何一种 Field 类型中。这里介绍一些常用且重要的通用字段选项,它们都有对应的默认值,这些字段选项都是可选的,理解这些有助于更好地使用它们。

  • blank

    默认值是 False,设置为 True 时,字段可以为空。设置为 False 时,字段是必须填写的。如果是字符型字段 CharField 和 TextField,它们是用空字符串来存储空值的。

  • unique

    默认值是 False,它是一个数据库级别的选项,规定该字段在表中必须是唯一的。

  • null

    默认为 False,如果此选项为 False 建议加入 default 选项来设置默认值。如果设置为 True,表示该列值允许为空。日期型、时间型以及数字型字段不接受空字符串。所以当设置 IntegerField,DateTimeField 型字段可以为空时,需要将 blank 与 null 均设为 True 才可以。

  • `db_index

    默认值是 False,如果设置为 True,Django 则会为该字段创建数据库索引,如果该字段经常作为查询的条件,那么就需要设置 db_index 选项,从而加快数据的检索速度。

  • db_column

    这个选项用于设置数据库表字段的名称。如果没有指定,Django 默认使用 Model 中字段的名字。

  • default

    用于给字段设置默认值,该选项可以设置为一个值或者是可以调用对象,但不能是可变对象,不同字段类型默认值也不同,比如 BooleanFiled 布尔类型 default 值为Ture 或者 False。主要的使用场景是当一个字段的值被用户省略时,后台服务器自动为该字段的设置默认值。

  • primary_key

    默认值是 False,如果设置为 True,表示该字段为主键,在 Django 中 默认 id 为主键,也就是说即使你的数据表中没有创建 id 字段,Django 也会自动为你创建 id 字段并将其设置为主键。如果你在表中设置了其他字段为主键的时,那么 Django 将取消为 id 字段设置主键。

  • choices
    这个选项用于给字段设置可以选择的值。它是一个可迭代对象,即列表或者元组,其中每一个元素都是一个二元组(a,b)的形式,a 是用来选择的对象,b 是对 a 的描述信息。比如我们对某个人性别定义数据表如下所示:

    # 创建表
    class UserInfo(models.Model):
        # 定义chocies参数的对应关系,以元组(或者列表)的形式进行表述:
        choices = (
            (male, '男性'),
            (female, '女性'),
        )
        gender = models.CharField(max_length=2,choices = choices,default='male')
    
    
  • verbose_name

    设置此字段在 admin 后台管理系统界面上的显示名称,如果没有设置这个字段,Django 将会直接展示字段名并且将字段中的下划线转变为空格

2.4 外键使用

有一个数据表,就应该对应一个模型 在models.py中定义模型

引入:from django.db import models

模型类要继承models.Model类

from django.db import models

# Create your models here.
class Grades(models.Model):
    """班级表"""
    gname = models.CharField(max_length=20)  # 班级名称
    gdate = models.DateTimeField()  # date
    gtotal = models.IntegerField()  # total

class Students(models.Model):
    """学生表"""
    sname = models.CharField(max_length=20)  # name
    sgender = models.BooleanField(default=True)  # gender
    sage = models.IntegerField()  # age
    # 关联外键
    sgrade = models.ForeignKey(Grades,models.DO_NOTHING)

on_delete=None,  # 删除关联表中的数据时,当前表与其关联的field的行为

on_delete=models.CASCADE,     # 删除关联数据,与之关联也删除

on_delete=models.DO_NOTHING,  # 删除关联数据,什么也不做

on_delete=models.PROTECT,     # 删除关联数据,引发错误ProtectedError

\# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL,  # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)

\# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)

2.5 应用数据库迁移

上面我们创建好了 index应用所需的数据表,下一步就是执行数据库的迁移,之后让我们再来看一下又有什么新的变化发生呢?数据库迁移的两个命令分步骤执行,

如下所示:

$ python manage.py makemigrations
$ python manage.py migrate

执行完毕后会在命令行得到如下输出:
在这里插入图片描述

在这里插入图片描述

若迁移过程中出现报错提示,首先检查您的 models.py 文件是否正确书写,除此之外,也可能由于 Django 与 MySQL 版本问题导致报错。

  • 从上述输出结果可以看出,我们对 index 应用进行了数据库迁移工作。
  • 并且在数据库中创建了三张表,分别是 Author、Book、UserInfo。

而且在 index 应用下的 migrations 目录下生还成了一个 0001_initial.py 的文件:

在这里插入图片描述

这个迁移文件包含了创建数据表时用到的所有信息,这是一个临时的过度文件。

makemigrationsmigrate 是 Django 中的两个命令,用于数据库迁移和同步模型。

makemigrations 命令会基于你的 Django应用中的模型定义,生成一组迁移文件,这些文件描述如何在数据库中创建或修改表结构。在执行 makemigrations命令时,Django 会比较当前模型定义与最近一次迁移所定义的模型之间的差异,并生成一系列 SQL 命令来执行这些更改。

示例命令:

$ python manage.py makemigrations

migrate 命令用于应用迁移,它会将迁移文件中定义的更改应用到数据库中。执行 migrate 命令时,Django会检查其中的每个迁移,执行其中定义的 SQL 命令,并将这些更改反映到数据库模式中。如果执行成功,你的 Django应用的数据模型就和数据库之间保持同步了。

示例命令:

$ python manage.py migrate

总之,makemigrations 命令会生成迁移文件,描述如何在数据库中创建或修改表结构,而 migrate命令会将这些迁移文件应用到数据库中,使数据模型保持和数据库之间的同步。这两个命令通常会在 Django开发过程中被频繁使用,需要对数据库进行修改,增加和删除操作。

关于Python学习指南

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

点击免费领取《CSDN大礼包》:Python入门到进阶资料 & 实战源码 & 兼职接单方法 安全链接免费领取

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

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

相关文章

这7个AI软件让设计效率飞起,快来收藏

伴随着AI技术的发展,设计师使用AI工具来提高工作效率已成为一种趋势,越来越多的AI工具也出现在市场上。本文收集了市场上7个好用的AI工具推荐给大家,一起来看看吧! 1、即时 AI 即时 AI是一款依赖AI技术,实现网页设计…

梯度(第四节)

目录 一.总结 二.l的方向余弦 三.方向导数 四.方向导数和方向余弦的联系 五.梯度 1.定义 2.性质 3.运算公式 4.例题 六.最快下降法 一.总结 上一节我们研究了数量场和矢量场的宏观特征,但宏观特征,在细节上往往无法展现事物的真正全 貌&…

Instruct2Act:使用大型语言模型将多模态指令映射到机器人动作

Instruct2Act:使用大型语言模型将多模态指令映射到机器人动作 基础模型在多种应用中取得了重大进步,包括文本到图像的生成、全景分割和自然语言处理。本文提出了一个名为Instruct2Act的框架,该框架利用大型语言模型将多模态指令映射为机器人…

代码随想录算法学习心得 42 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II...

一、买卖股票的最佳时机 链接:力扣 描述:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算…

iOS添加测试设备报错ineligible for 14 days

2023年7月8日申请苹果个人开发账号审核通过。 2023年7月10日在苹果开发平台分别创建Certificates、Identifiers、Devices添加一台测试设备、Profiles,将已经准备好的项目打包上传,使用testflight测试app,使用测试设备一切顺利。 2023年7月1…

中缀表达式转前、后缀表达式

中缀表达式:按照人为理解的运算优先顺序进行计算,如ab 前缀表达式:运算符在括号之前,如ab 后缀表达式:运算符提在括号之后,如ab 解题步骤: ①用括号把每一个表达式括起来(可以先全部括起来后挨…

RPC分布式网络通信框架(一)—— protobuf的使用

文章目录 一、protobuf的好处二、如何创建proto三、编译生成的C类UserServiceRpcUserServiceRpc_Stub四、序列化和反序列化序列化反序列化 粘包问题解决调用者组包提供者解包 一、protobuf的好处 1、protobuf是二进制存储的,xml和json都是文本存储的。故protobuf占…

综合布线系统(PDS)

综合布线系统(PDS) 综合布线系统的基本标准 ● TIA/EIA-568A/B:商业大楼电信布线标准 ● EIA/TIA-569:电信通道和空间的商业大楼标准 ● EIA/TIA-570:住宅和N型商业电信布线标准 ● TIA/EIA-606:商业大楼电信基础设施…

windows便签推荐哪款?

随着科技技术的进步,越来越多的人喜欢使用便签软件,因为它们能帮助我们快速记录和管理重要的信息和任务。在快节奏的现代生活中,便签软件成为了我们生活和工作中不可或缺的工具。特别是对于经常使用电脑的用户来说,一款优秀的便签…

戴尔外星人x16r1原装Win11系统带F12还原功能

戴尔外星人x16r1原装Win11系统带F12还原功能 电脑恢复到新机状态,完成: 1.系统恢复到预装系统,与新机买来状态完全一致; 2.隐藏恢复分区,戴尔与外星人相同,可以用来开机F12进入supportassis os recovery…

选择排序

选择排序 排序步骤(有n个数需要排序) 在一组序列中找到最大/小的元素,将其与序列的起始位置交换;此时可进一步缩小排序范围,将改序列的起始位置移出;寻找剩余范围序列中的最大/小值,与此时序列…

deeplabv3+源码之慢慢解析 第二章datasets文件夹(1)voc.py--voc_cmap函数和download_extract函数

系列文章目录(更新中) 第一章deeplabv3源码之慢慢解析 根目录(1)main.py–get_argparser函数 第一章deeplabv3源码之慢慢解析 根目录(2)main.py–get_dataset函数 第一章deeplabv3源码之慢慢解析 根目录(3)main.py–validate函数 第一章deeplabv3源码之…

JS UMD规范实现

UMD实现范例 (function (root, factory) {if (typeof module object && typeof module.exports object) {console.log(是commonjs模块规范,nodejs环境);var depModule require(./umd-module-depended);module.exports factory(depModule);} else if (t…

ElasticSearch入门教程--集群搭建和版本比较

文章目录 一、ElasticSearch 集群二、Elasticsearch的核心概念2.1、分片(Shards)2.2、副本(Replicas)2.3、路由计算2.4、倒排索引 三、Kibana简介四、Spring Data ElasticSearch 一、ElasticSearch 集群 Elasticsearch 集群有一个…

python pytorch 纯算法实现前馈神经网络训练(数据集随机生成)-续

python pytorch 纯算法实现前馈神经网络训练(数据集随机生成)-续 上一次的代码博主看了,有两个小问题其实,一个是,SGD优化的时候,那个梯度应该初始化为0,还一个是我并没有用到随机生成batch。 …

Flowable边界事件-定时边界事件

定时边界事件 定时边界事件一、定义1. 图形标记2. 完整的流程图3. XML标记 二、测试用例2.1 定时边界事件xml文件2.2 定时边界事件测试用例 总结 定时边界事件 一、定义 时间达到设定的时间之后触发事件 由于定时边界事件和开始定时事件几乎差不多,四种情况我就不一…

14、双亲委托模型

双亲委托模型 先直接来看一幅图 双亲委派模型的好处: 主要是为了安全性,避免用户自己编写的类动态替换Java的一些核心类,比如 String。 同时也避免了类的重复加载,因为JVM中区分不同类,不仅仅是根据类名&#xff0c…

React 新版官方文档 (二) useState 用法详解

背景 本文默认读者对 useState 有最为基本的了解,比如知道他的写法应当是怎样的,下面着重介绍部分重要的、在开发过程中会踩的坑和一些特性,最后动手实现一个最基本的 useState 代码 useState ⭐️ 注意事项: 状态只在下次更新时异步变化&…

Shiro教程(一):入门概述与基本使用

Shiro 第一章:入门概述 1.1 Shiro是什么 Apache.Shiro是一个功能强大且易于使用的Java安全(权限)框架。Shiro可以完成:认证、授权、加密、会话管理、与Web集成、缓存等。借助Shiro可以快速轻松地保护任何应用程序——从最小的移…

用于3D渲染和平面设计应该怎么选择显卡?

首先了解快速解决3D渲染本地配置不足,节省硬件成本的方法: 本地电脑资源不足,在不增加额外的硬件成本投入的情况下,想要快速提升渲染速度,可使用渲云云渲染,且可批量渲染,批量出结果&#xff0…