Django新手必看:如何创建应用和定义数据表。(详细讲解)
作者:mmseoamin日期:2023-12-11

Django新手必看:如何创建应用和定义数据表。

  • 1. Django创建应用
      • 1.1 创建应用
      • 1.2 应用的添加
      • 2. Django ORM
          • 2.1 定义数据表
          • 2.2 定义项目数据表
          • 2.3 通用字段选项
          • 2.4 外键使用
          • 2.5 应用数据库迁移

            🏘️🏘️个人简介:以山河作礼。

            🎖️🎖️:Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主

            🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读!

            🎁🎁:文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。

            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 目录:

                Django新手必看:如何创建应用和定义数据表。(详细讲解),在这里插入图片描述,第1张

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

                • 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 适配了多种常用的关系型数据库。

                      Django新手必看:如何创建应用和定义数据表。(详细讲解),在这里插入图片描述,第2张

                      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
                              

                              执行完毕后会在命令行得到如下输出:

                              Django新手必看:如何创建应用和定义数据表。(详细讲解),在这里插入图片描述,第3张

                              Django新手必看:如何创建应用和定义数据表。(详细讲解),在这里插入图片描述,第4张

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

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

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

                                Django新手必看:如何创建应用和定义数据表。(详细讲解),在这里插入图片描述,第5张

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

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

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

                                示例命令:

                                $ python manage.py makemigrations
                                

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

                                示例命令:

                                $ python manage.py migrate
                                

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

                                              ⭐感谢赞助⭐

                                Django新手必看:如何创建应用和定义数据表。(详细讲解),在这里插入图片描述,第6张

                                618,清华社 IT BOOK 多得图书活动开始啦!活动时间为2023年6月7日至6月18日,清华社为您精选多款高分好书,涵盖了C++、Java、Python、前端、后端、数据库、算法与机器学习等多个IT开发领域,适合不同层次的读者。全场5折,扫码领券更有优惠哦!快来京东点击链接IT BOOK多得https://pro.m.jd.com/mall/active/3Rho97HkMaGFycLzAWfFdvZdyvRn/index.html