models.py本文根据datawhale开源Djiango后端开发入门( https://github.com/Joe-2002/sweettalk-django4.2 )Task01:搭建虚拟环境和项目以及构建数据表做的学习笔记。作为一名太小白,学习过程中得到学习团队大佬们的帮助,表示感谢!
一、数据模块介绍–models.py
1 模块功用
models.py 该函数用于编写数据模型,数据模型间有三种关系:一对一OneToOne、 一对多(ForeignKey,也是后面提及的外键)以及多对多(ManyToManyField)关系。
2 程序结构
包括导入包和数据模块编程两个部分:
(1)包导入
使得后面的数据模型继承django.db.models.Model。代码为:
from django.db import models # 采用此语句后面的class表中的字段需添加models.
或者 from django.db.models import * #采用此语句,则后面的models.不用添加,可以节约写代码时间。
(2)模型代码
一个数据模型对应一个数据库表。属性名是字段名,它的类型(例CharField)相当于数据库的字段类型(例如varchar)。模型代码格式如下:
class 表1(Model):
# “数据表定义
表1属性名1 = 属性类型(参数1,参数2...,参数n1)
表2属性名2=属性类型(参数1,参数2...,参数n2)
class 表2(Model):
# “数据表定义
表2属性名1 = 属性类型(参数1,参数2...,参数n1)
表2属性名2= 属性类型(参数1,参数2...,参数n1)
.........
3 字段解读
(1)类型定义
类型名称 | 类型含义 |
---|---|
BooleanFiel | 布尔类型字段 |
CharField | 字符串类型字段 |
DateTimeField | 日期字段 |
DecimalField | (精确)小数字段 |
EmailField | :Email字段 |
FileField | 保存和处理上传的文件 |
FloatField | (浮点数)小数字段 |
Imagefield | 保存和处理上传的图片 |
IPAddressField | IP字段 |
IntegerField | 整数字段 |
TextField | 文本字段 |
URLField | 网页地址字段 |
(2)字段描述
以CharField为例,从官网进行的定义截图(其他详细内容可查阅django官网):
![]() |
(3)常用字段选项:
选项名称 | 选项含义 |
---|---|
null(null=True,False) | 是否可以为空(数据库进行验证) |
blank(blank=True | False) |
choices | 轻量级的配置字段可选属性的定义 |
default | 字段的默认选项 |
help_text | 字符按文字帮助 |
primary_key(=True | False) |
unique | 是否唯一(对于数据表而言) |
verbose_name | 字段详细名称,若不指则默认使用字段属性名称 |
二 外键用法
1 定义
用于建立表之间关联关系的约束。 一张表的一个字段(非主键)指向另外一个表的主键,那么该字段就称之为外键。
2 语法形式
ForeignKey(othermodel, on_delete, **options)。
3 参数说明
(1)必选参数
- 关联的表格(主表,othermodel):在默认的情况下,外键储存的是主表的主键(Primary key)。
- 删除方式(on_delete):on_delete=CASCADE,表示当主表的字段被删除时,和它有关子表字段也会被删除。此外,还有 PROTECT(返回错误提示,阻止删除),SET_NULL(用null替代),SET_DEFAULT(用默认值替代),或者用 SET()自定义。
(2)常用可选参数
-
to_field: 设置关联到主表的字段。关联字段内容必须不重复。在默认情况下,Django 关联到的字段是主表的主键(这是由于成为主键的要求之一就是不重复)
-
related_name:自定义一个名称,用于反向查询。当一张子表里,多个foreignkey指向同一个主表,related_name必须设置。
举例:
category = ForeignKey(GoodsCategory,on_delete=SET_NULL,
related_name=‘goods_set’,null=True,verbose_name=‘产品分类’)
三 数据库迁移
Django数据模型新增或者更改后,需要在数据库中实现数据表的创建或者更新,这一任务分解为两个步骤实现:
1 在项目应用的migrations/ 目录下生成迁移脚,命令为:python manage.py makemigrations
2 应用脚本在数据库中生成数据表,命令为:python manage.py migrate
运行python manage.py makemigrations 可能会出现no changed的运行提示。网络上有各种次类问题解决措施。本人的有效解决措施是:== 首先运行python manage.py makemigrations --empty 项目应用名称 然后再运行python manage.py makemigration即可。==
四 admin后台管理
admin后台管理功能很简单,就是创建超级管理员。执行:python manage.py createsuperuser 命令就提示你输入相应的用户名,邮箱地址和密码信息。
五 应用举例
1 任务要求
在数据库中创建产品分类和产品信息两个表,并且进行超级管理员的创建,并在后台查看数据库内容。
2 编程思路分析
- 产品分类通常包括分类名称和相应说明(或者备注),用字符表示。因此,可以用字符类型。
- 产品信息表通常包括:编号、名称、条码、产品分类、规格、保质期天数、采购价、零售价和备注。其中:编号、名称、条码、产品分类、规格等可以用字符类型定义,保质期天数、采购价、零售价可以用整数类型或者字符类型定义。
- 两个表均有产品分类,故可以用外键实现表字段共享与链接。
- 数据库创建通过数据库迁移两条命令实现。
- 创建超级管理员用createsuperuser命令实现。
- 启动轻量级服务器,登录网址,查看数据库。
3 任务实现
(1)models.py程序编写:
(这里代码来自datawhale开设的Django入门课程之P04。)
from django.db.models import *
class GoodsCategory(Model):
#产品分类
name = CharField(max_length=64, verbose_name='名称')
remark = CharField(max_length=256, null=True, blank=True, verbose_name='备注')
class Goods(Model):
# 产品
number = CharField(max_length=32, verbose_name='编号')
name = CharField(max_length=64, verbose_name='名称')
barcode = CharField(max_length=32, null=True, blank=True, verbose_name='条码')
# 外键(on_delete 设置当外键对应的数据被删除时的反应, null=True)
category = ForeignKey(GoodsCategory, on_delete=SET_NULL,related_name='goods_set',null=True,verbose_name='产品分类')
spec = CharField(max_length=64, null=True, blank=True, verbose_name='规格')
shelf_life_days = IntegerField(null=True, verbose_name='保质期天数')
purchase_price = FloatField(default=0, verbose_name='采购价')
retail_price = FloatField(default=0, verbose_name='零售价')
remark = CharField(max_length=256, null=True, blank=True, verbose_name='备注')
class Meta:
db_table = 'Goods'
#本来是默认的goods+s,下面这个可以修改名字
verbose_name_plural = '商品'
def __str__(self):
return self.name
(2)数据库迁移
在manage.py目录下先后运行python manage.py makemigrations和 python manage.py migrate命令。迁移成功后,会弹出如下界面:
![]() |
(3)创建超级管理员
(4)启动轻量级服务器:
(5)进入网址,查看数据库
![]() |
(6)数据输入
这里是空数据表。通过添加和修改,可以进行数据输入
![]() |
![]() |
(7)数据库查看
在vscode环境中,打开数据库,查看数据表内容:
![]()
|