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 目录:
我们对这些文件做逐一的解释:
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 的文件:
这个迁移文件包含了创建数据表时用到的所有信息,这是一个临时的过度文件。
makemigrations
和 migrate
是 Django 中的两个命令,用于数据库迁移和同步模型。
makemigrations
命令会基于你的 Django应用中的模型定义,生成一组迁移文件,这些文件描述如何在数据库中创建或修改表结构。在执行makemigrations
命令时,Django 会比较当前模型定义与最近一次迁移所定义的模型之间的差异,并生成一系列 SQL 命令来执行这些更改。
示例命令:
$ python manage.py makemigrations
migrate
命令用于应用迁移,它会将迁移文件中定义的更改应用到数据库中。执行migrate
命令时,Django会检查其中的每个迁移,执行其中定义的 SQL 命令,并将这些更改反映到数据库模式中。如果执行成功,你的 Django应用的数据模型就和数据库之间保持同步了。
示例命令:
$ python manage.py migrate
总之,
makemigrations
命令会生成迁移文件,描述如何在数据库中创建或修改表结构,而migrate
命令会将这些迁移文件应用到数据库中,使数据模型保持和数据库之间的同步。这两个命令通常会在 Django开发过程中被频繁使用,需要对数据库进行修改,增加和删除操作。
⭐感谢赞助⭐
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