Django数据库模型创建实战:从模型定义到数据迁移
Django数据库模型创建实战:从模型定义到数据迁移
本文将详细介绍如何在Django框架中创建数据库模型。通过一个名为“天天生鲜”的项目实例,我们将学习如何定义模型类、创建迁移文件以及执行迁移。此外,文章还将列举Django中常用的字段类型及其适用场景,帮助读者更好地理解数据库模型的开发过程。
在 Django 中进行数据库开发的主要步骤如下:
- 定义模型类:在 models.py 模块中定义模型类
- 创建迁移文件:根据模型类创建用于生成 SQL 的配置文件
- 执行迁移:根据 SQL 配置文件创建 SQL 语句并执行
- 数据库操作:通过模型类方法对数据库执行 CRUD 操作
接下来就按照这几个步骤来完成天天生鲜项目的模型创建功能。第一步就是定义模型类。
在 Django 中一个模型类就对应着数据库中的一张表,对模型类的任何操作都是对数据库表的操作。基于对天天生鲜项目的业务分析可知,该项目一共需要四张数据库表,分别介绍如下:
(1) 关于商品展示部分,需要两张数据库表:
- GoodsCategory 表,用于存储商品分类信息,它的列包括:
- 分类显示名称
- 分类显示样式
- 分类显示图片
- GoodsInfo 表,用于存储商品具体信息,它的列包括:
- 商品价格
- 商品图片
- 商品描述
- 商品分类
(2) 关于购物车部分,需要两张数据库表:
- OrderInfo 表,用于存储订单基本信息,它的列包括:
- 订单编号
- 收货地址
- 收货人
- 联系电话
- 订单运费
- 订单备注
- 订单状态
- OrderGoods 表,用于存储订单所对应的商品信息,它的列包括:
- 订单商品
- 订单数量
- 所属订单
下面是具体的模型类代码实现:
# goods/models.py
from django.db import models
# Create your models here.
# 商品分类表
class GoodsCategory(models.Model):
# 分类名称
cag_name = models.CharField(max_length=30)
# 分类样式
cag_css = models.CharField(max_length=20)
# 分类图片
cag_img = models.ImageField(upload_to='cag')
# 商品表
class GoodsInfo(models.Model):
# 商品名字
goods_name = models.CharField(max_length=100)
# 商品价格
goods_price = models.IntegerField(default=0)
# 商品描述
goods_desc = models.CharField(max_length=2000)
# 商品图
goods_img = models.ImageField(upload_to='goods')
# 所属分类
goods_cag = models.ForeignKey('GoodsCategory', on_delete=models.CASCADE)
# cart/models.py
from django.db import models
# Create your models here.
# 订单信息
class OrderInfo(models.Model):
status = {
(1, '待付款'),
(2, '待发货'),
(1, '待收获'),
(1, '已完成'),
}
# 订单编号
order_id = models.CharField(max_length=100, null=False)
# 订单地址
order_add = models.CharField(max_length=100)
# 收货人
order_recv = models.CharField(max_length=50)
# 联系电话
order_tele = models.CharField(max_length=11)
# 运费
order_fee = models.CharField(max_length=10)
# 订单备注
order_extra = models.CharField(max_length=200, blank=True, verbose_name='订单备注')
# 订单状态
order_status = models.IntegerField(default=1, choices=status)
# 订单商品
class OrderGoods(models.Model):
# 所属商品
goods_info = models.ForeignKey('goods.GoodsInfo', on_delete=models.CASCADE)
# 商品数量
goods_num = models.IntegerField()
# 商品所属订单
goods_order = models.ForeignKey('OrderInfo', on_delete=models.CASCADE)
Django 中常用的字段类型及其适用场景
一、基础文本类字段
- CharField
- 用途:存储短文本(如标题、名称、状态码)。
- 必选参数:max_length(最大字符数)
- 示例:
name = models.CharField(max_length=100) # 商品名称 status = models.CharField(max_length=20, choices=(('paid', '已支付'), ('shipped', '已发货')))
- TextField
- 用途:存储长文本(如描述、评论内容)。
- 无长度限制,适合大段文本。
- 示例:
description = models.TextField() # 商品详情描述
二、数值类字段
- IntegerField
- 用途:存储整数(如库存数量、年龄)。
- 示例:
stock = models.IntegerField(default=0) # 库存数量
- PositiveIntegerField
- 用途:存储正整数(如销量、浏览次数)。
- 禁止负数。
- 示例:
views = models.PositiveIntegerField(default=0) # 商品浏览量
- DecimalField
- 用途:存储精确小数(如价格、金额)。
- 必选参数:max_digits(总位数)、decimal_places(小数位数)
- 示例:
price = models.DecimalField(max_digits=10, decimal_places=2) # 价格(如999999.99)
三、日期时间类字段
- DateField
- 用途:存储日期(年-月-日)。
- 常用参数:
- auto_now_add=True(创建时自动记录日期)
- auto_now=True(每次保存时更新日期)
- 示例:
created_date = models.DateField(auto_now_add=True) # 订单创建日期
- DateTimeField
- 用途:存储日期+时间(年-月-日 时:分:秒)。
- 参数同 DateField。
- 示例:
updated_time = models.DateTimeField(auto_now=True) # 最后修改时间
四、布尔类字段
- BooleanField
- 用途:存储 True/False(如是否上架、是否删除)。
- 默认值:default=False
- 示例:
is_active = models.BooleanField(default=True) # 商品是否上架
五、关联关系类字段
- ForeignKey
- 用途:定义多对一关系(如订单属于某个用户)。
- 必选参数:to(关联的模型类)、on_delete(删除策略)
- 示例:
user = models.ForeignKey(User, on_delete=models.CASCADE) # 订单所属用户
- ManyToManyField
- 用途:定义多对多关系(如商品属于多个分类)。
- 示例:
categories = models.ManyToManyField(Category) # 商品的分类
六、其他实用字段
- EmailField
- 用途:验证电子邮件格式。
- 示例:
user_email = models.EmailField() # 用户邮箱
- URLField
- 用途:验证 URL 格式。
- 示例:
website = models.URLField() # 商品官网链接
- FileField / ImageField
- 用途:存储文件或图片路径。
- 需要安装 Pillow 库(仅限 ImageField)。
- 示例:
image = models.ImageField(upload_to='products/') # 商品图片
七、字段选项(通用参数)
所有字段均可通过以下选项增强功能:
- null=True:允许数据库存储 NULL(默认为 False)。
- blank=True:允许表单验证为空(默认为 False)。
- default:设置默认值。
- unique=True:值必须唯一。
- choices:限制值为预定义选项(常用于 CharField)。
- 示例:
SIZE_CHOICES = [('S', 'Small'), ('M', 'Medium')] size = models.CharField(max_length=1, choices=SIZE_CHOICES) # 商品尺寸
八、字段选择对比表
数据类型 | 适用场景 | 示例 |
---|---|---|
CharField | 短文本(<=255字符) | 商品名称、订单号 |
TextField | 长文本(无长度限制) | 商品描述、评论内容 |
IntegerField | 整数(正负均可) | 库存、年龄 |
DecimalField | 精确小数(金额、重量) | 价格、评分 |
BooleanField | 是/否状态 | 是否上架、是否删除 |
DateTimeField | 日期+时间 | 订单创建时间 |
二、创建迁移文件
模型类定义完成之后,Django框架就可以按照已定义的模型类来创建对应的数据库表了。创建数据库表分为两步:先创建迁移文件,然后执行该迁移文件。在此之前,先查看一下项目的目录结构,会发现 goods 应用和 cart 应用的 migrations 目录都为空。在执行完迁移命令之后,migrations 目录会发生变化。打开终端,进入项目所在目录,然后执行以下模型迁移命令:
python manage.py makemigrations
执行迁移时可能会有关于 on_delete 的报错:
- ForeignKey 字段里,都要加上 on_delete
- 缺少 Pillow
python -m pip install Pillow
执行语句:
完成迁移:
现在再次查看 migrations 目录,会发现目录下增加了名为 001_initial.py 的文件。该文件就是当前应用的迁移文件,只需使用以下命令,就可以查看 goods 相对应的 SQL 语句:
python manage.py sqlmigrate goods 0001
上述命令将 0001 文件转换为 SQL 语句,效果如下:
三、执行迁移
迁移文件创建成功后,下一步就是执行迁移,也就是执行对应的 SQL 语句,在数据库中创建对应的数据库表。命令行输入:
数据库里查看: