1、回顾已经改动的代码
settings.py
databases
language_code $ time_zone
installed_apps
test_plt/models.py
calss Project
test_plt/admin.py
admin.site.register
2、让前端页面显示中文
- 全局级:网页名、整体框架名
- app级别:
- app里面的模块model级别:
- 模块中的字段名改为中文
3、在模块中添加需要的业务字段
3.1 在models.py中进行数据库设计
class Project(models.Model):
"""
增加测试项目
"""
PROJECT_TYPE = (
(1, "web"),
(2, "App"),
(3, "微服务"),
)
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=200, verbose_name="测试项目名称")
version = models.CharField(max_length=20, verbose_name="版本")
type = models.IntegerField(verbose_name="产品类型", choices=PROJECT_TYPE)
description = models.CharField(max_length=200, verbose_name="项目描述", blank=True, null=True)
status = models.BooleanField(default=True, verbose_name="状态")
created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, verbose_name="创建人", db_column="created_by")
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
updated_at = models.DateTimeField(auto_now=True, verbose_name="最近更新时间")
members = models.ManyToManyField(User, related_name="project_members",
through="ProjectMember",
through_fields=('project', 'user'))
def __str__(self):
return self.name
class Meta:
verbose_name = "测试项目"
verbose_name_plural = verbose_name
3.2 makemigrations 生成数据库迁移文件
通过运行 makemigrations 命令,django会检测你对模型文件的修改,并把修改的部分储存为一次迁移,生成用于生成数据库表的文件,在 migrations目录下: python manage.py makemigrations test_plt 查看生成的迁移文件:python manage.py sqlmigrate test_plt
3.3 migrate 执行数据库迁移文件
- 这个 migrate 命令查看 INSTALLED_APPS 配置,并根据 mysite/settings.py 文件中的数据库配置和随应用提供的数据库迁移文件(我们将在后面介绍这些),创建任何必要的数据库表。
- miagrate 命令选中所有还没有执行过迁移的文件并去执行它,也就是将我们对模型的更改同步到数据库结构上,它能让我们在开发中持续的改变数据库结构而不需要重新删除和创建表,它专注于是数据库平滑升级而不丢失数据。
python manage.py migrate 注意:数据库迁移被分解成生成和应用两个命令,是为了让我们能够在代码控制系统上提交迁移数据库并使其能在多个用用里使用,这部仅仅会让开发简单,也给别的开发和生产环境中的使用带来方便。了方便大多数项目,django在开始项目的时候默认激活了一些应用,但并不是每个人都需要它们。如果你不需要某个或某些应用,你可以在运行 migrate 前毫无顾虑地从 INSTALLED_APPS 里注释或者删除掉它们。 migrate 命令只会为在 INSTALLED_APPS 里声明了的应用进行数据库迁移。
3.4 界面查看修改的内容
- 刷新浏览器即可,
为什么不需要重启服务器执行:python manage.py runserver 8000 注意: Debug=True运行时,改动文件里面的代码我们不需要重启服务,因为runserver是持续发送请i去的,但是添加新的py文件比如说创建了新的app,我们肯定是要重启服务的。 官网是这样描述的:会自动重启的runserver,用户开发的服务器在需要的情况下会对每一次的访问请求重新载入一边python代码,所以不需要为了让修改的代码生效而频繁的重新启动服务器。除了一些动作,比如新增文件
4、数据库字段如何设计?
4.1、 django与数据库的关系
4.2、 数据库字段设计思路
- 字段类型选择【field数据类型】
- AutoField 它是一个自动递增的 IntegerField,取值范围为-2147483648~2147483647(-231~231-1)。
- BigAutoField 它是一个 64 位整数,非常类似于 AutoField,不同之处在于它保证可以容纳 1 到 9223372036854775807 之间的数字(1~2^63-1)。
- BigIntegerField 它是一个 64 位整数,非常类似于 IntegerField,不同之处在于它保证可以容纳从-9223372036854775808 到 9223372036854775807 的数字(-263~263- 1)。
- BinaryField 一个用于存储原始二进制数据的字段。
- BooleanField True/False 字段。此字段的默认表单窗口小部件是 CheckboxInput。
- CharField 一个字符串字段,用于大小字符串。对于大量的文本,使用 TextField。这个字段的默认表单小部件是 TextInput。
- DateField 它是一个日期,在 Python 中由 datetime.date 实例表示。
- DateTimeField 它用于日期和时间,在 Python 中由 datetime.datetime 实例表示。
- DecimalField 它是一个固定精度的十进制数字,在 Python 中由 Decimal 实例表示。
- DurationField 用于存储时间段的字段。在 Python 中由 timedelta 表示。一般没必要使用。
- EmailField 这是一个 CharField,用于检查该值是否为有效的电子邮件地址。
- FileField 这是一个文件上传字段。
- FloatField 它是 Python 中由 float 实例表示的浮点数。
- ImageField 它继承了 FileField 的所有属性和方法,还验证了上载的对象是有效的图像。
- IntegerField 它是一个整数字段。在 Django 支持的所有数据库中,-2147483648 到 2147483647 之间的值都是安全的。
- GenericIPAddressField 字符串格式的 IPv4 或 IPv6 地址(例如 192.0.2.30 或 2a02:42fe :: 4)。
- NullBooleanField 类似于 BooleanField,但允许 NULL 作为选项之一。
- PositiveIntegerField 类似于 IntegerField,但必须为正数或零(0)。
- PositiveSmallIntegerField 类似于 PositiveIntegerField,但仅允许在特定点(与数据库有关)下的值。字段类型 描述
- SlugField Slug 是一个报纸术语。slug 是某事物的简短标签,仅包含字母,数字,下划线或连字符。它们通常在 URL 中使用。
- SmallIntegerField 它就像 IntegerField,但仅允许在特定点(与数据库有关)下的值。
- TextField 大文本字段。此字段的默认表单窗口小部件是 Textarea。
- TimeField 时间,在 Python 中由 datetime.time 实例表示。
- URLField URL 的 CharField,由 URLValidator 验证。
- UUIDField 用于存储通用唯一标识符的字段。使用 Python 的 UUID 类。在 PostgreSQL 上使用时,它存储在 uuid 数据类型中,否则存储在 char(32)中。字段类型 描述
- ForeignKey 多对一关系。需要两个位置参数:与模型相关的类和 on_delete 选项。
- ManyToManyField 多对多关系。需要一个位置参数:与模型相关的类,其工作方式与 ForeignKey完全相同,包括递归和惰性关系。
- OneToOneField 一对一的关系。从概念上讲,这类似于具有 unique = True 的 ForeignKey,但是关系的“反向”侧将直接返回单个对象。
- Django 模型数据类型和数据库生成的 DDL 参考
- ID生成策略
比如项目ID是自增的
AutoField
integer/auto increment
缺点:暴露业务信息订单量
uuid
缺点:索引不到
snowflake
优点:不容易发生信息泄露
- 主键:是唯一的,可以被关联到其它表作为外键
- 空/非空
- 缺省值:比如创建时间,可以使用当前时间作为缺省值,不用人再输入
- 长度:varchar() utf8,允许输入几个汉字?10个,utf8每个汉字3个字节,3bytes
- 唯一:用户手机号必须唯一,防止不必要的麻烦
- 索引
索引是为查询服务的,一般主键、外键、查询/排序条件都得加
1、是不是所有字段都该有?
只有被作为查询条件或者排序
2、索引是不是越多越好?
如非必要,就不加
3、索引占不占磁盘空间、内存?占
- 外键
1、外键有什么用?保障数据一致性
2、当你得程序能保障一致性,数据库可以不要外键
3、当你得程序没有严谨得数据一致性设计,有bug了,加班修数据
5、调整界面列表布局
- 指定要显示、不显示的字段
- 指定可过滤的字段
- 指定可查询的字段
from django.contrib.admin import ModelAdmin
from .models import Project
@admin.register(Project)
class ProjectAdmin(ModelAdmin):
"""创建项目管理列表类
"""
list_display = ["id", "name", "type", "status", "created_by", "created_at"]
list_display_links = ["id", "name"]
list_filter = ["created_at", "type"]
search_fields = ["name"]
|