问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Django数据库模型创建实战:从模型定义到数据迁移

创作时间:
作者:
@小白创作中心

Django数据库模型创建实战:从模型定义到数据迁移

引用
CSDN
1.
https://blog.csdn.net/weixin_56708289/article/details/146336787

本文将详细介绍如何在Django框架中创建数据库模型。通过一个名为“天天生鲜”的项目实例,我们将学习如何定义模型类、创建迁移文件以及执行迁移。此外,文章还将列举Django中常用的字段类型及其适用场景,帮助读者更好地理解数据库模型的开发过程。

在 Django 中进行数据库开发的主要步骤如下:

  1. 定义模型类:在 models.py 模块中定义模型类
  2. 创建迁移文件:根据模型类创建用于生成 SQL 的配置文件
  3. 执行迁移:根据 SQL 配置文件创建 SQL 语句并执行
  4. 数据库操作:通过模型类方法对数据库执行 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 中常用的字段类型及其适用场景

一、基础文本类字段

  1. CharField
  • 用途:存储短文本(如标题、名称、状态码)。
  • 必选参数:max_length(最大字符数)
  • 示例:
    name = models.CharField(max_length=100) # 商品名称
    status = models.CharField(max_length=20, choices=(('paid', '已支付'), ('shipped', '已发货')))
    
  1. TextField
  • 用途:存储长文本(如描述、评论内容)。
  • 无长度限制,适合大段文本。
  • 示例:
    description = models.TextField() # 商品详情描述
    

二、数值类字段

  1. IntegerField
  • 用途:存储整数(如库存数量、年龄)。
  • 示例:
    stock = models.IntegerField(default=0) # 库存数量
    
  1. PositiveIntegerField
  • 用途:存储正整数(如销量、浏览次数)。
  • 禁止负数。
  • 示例:
    views = models.PositiveIntegerField(default=0) # 商品浏览量
    
  1. DecimalField
  • 用途:存储精确小数(如价格、金额)。
  • 必选参数:max_digits(总位数)、decimal_places(小数位数)
  • 示例:
    price = models.DecimalField(max_digits=10, decimal_places=2) # 价格(如999999.99)
    

三、日期时间类字段

  1. DateField
  • 用途:存储日期(年-月-日)。
  • 常用参数:
  • auto_now_add=True(创建时自动记录日期)
  • auto_now=True(每次保存时更新日期)
  • 示例:
    created_date = models.DateField(auto_now_add=True) # 订单创建日期
    
  1. DateTimeField
  • 用途:存储日期+时间(年-月-日 时:分:秒)。
  • 参数同 DateField。
  • 示例:
    updated_time = models.DateTimeField(auto_now=True) # 最后修改时间
    

四、布尔类字段

  1. BooleanField
  • 用途:存储 True/False(如是否上架、是否删除)。
  • 默认值:default=False
  • 示例:
    is_active = models.BooleanField(default=True) # 商品是否上架
    

五、关联关系类字段

  1. ForeignKey
  • 用途:定义多对一关系(如订单属于某个用户)。
  • 必选参数:to(关联的模型类)、on_delete(删除策略)
  • 示例:
    user = models.ForeignKey(User, on_delete=models.CASCADE) # 订单所属用户
    
  1. ManyToManyField
  • 用途:定义多对多关系(如商品属于多个分类)。
  • 示例:
    categories = models.ManyToManyField(Category) # 商品的分类
    

六、其他实用字段

  1. EmailField
  • 用途:验证电子邮件格式。
  • 示例:
    user_email = models.EmailField() # 用户邮箱
    
  1. URLField
  • 用途:验证 URL 格式。
  • 示例:
    website = models.URLField() # 商品官网链接
    
  1. 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 的报错:

  1. ForeignKey 字段里,都要加上 on_delete
  2. 缺少 Pillow
    python -m pip install Pillow
    

执行语句:
完成迁移:
现在再次查看 migrations 目录,会发现目录下增加了名为 001_initial.py 的文件。该文件就是当前应用的迁移文件,只需使用以下命令,就可以查看 goods 相对应的 SQL 语句:

python manage.py sqlmigrate goods 0001

上述命令将 0001 文件转换为 SQL 语句,效果如下:

三、执行迁移

迁移文件创建成功后,下一步就是执行迁移,也就是执行对应的 SQL 语句,在数据库中创建对应的数据库表。命令行输入:

数据库里查看:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号