热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

天天生鲜—创建数据库

一、分析需求,得到表之间的关联说明:创建数据库之前应该有一个需求分析的过程,这个过程主要是依据需求方的需求文档,进行分析&

一、分析需求,得到表之间的关联

说明:创建数据库之前应该有一个需求分析的过程,这个过程主要是依据需求方的需求文档,进行分析,需要什么功能,实现这些功能需要哪些表,表与表之间的关联如何,以及实现一些功能时需要用到哪些技术,都需要在这个步骤分析清楚。
在这里插入图片描述


二、依据表的分析,创建数据库,表

1、创建基类base_model
在项目目录下创建python文件夹db—>创建python文件base_model.py——>创建基类,代码如下:

from django.db import modelsclass BaseModel(models.Model):"""创建一个数据库的基类,"""create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')modify_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')is_delete = models.BooleanField(default=True, verbose_name='删除标记')class Meta:abstract = True # 说明这是一个抽象类的模型。

2、user应用下创建User表,直接继承django自导的abstractUser类。

from django.contrib.auth.models import AbstractUser
from db.base_model import BaseModel
from django.db import modelsclass User(AbstractUser, BaseModel):"""这里是直接使用django自带的user类"""class Meta:db_table = 'df_user'verbose_name_plural = verbose_name = '用户'class AddressManager(models.Manager):'''地址模型管理器类'''# 1.改变原有查询的结果集:all()# 2.封装方法:用户操作模型类对应的数据表(增删改查)def get_default_address(self, user):'''获取用户默认收货地址'''# self.model:获取self对象所在的模型类try:address = self.get(user=user, is_default=True) # models.Managerexcept self.model.DoesNotExist:# 不存在默认收货地址address = Nonereturn addressclass Address(BaseModel):'''地址模型类'''user = models.ForeignKey('User', verbose_name='所属账户', on_delete=models.CASCADE)receiver = models.CharField(max_length=20, verbose_name='收件人')addr = models.CharField(max_length=256, verbose_name='收件地址')zip_code = models.CharField(max_length=6, null=True, verbose_name='邮政编码')phone = models.CharField(max_length=11, verbose_name='联系电话')is_default = models.BooleanField(default=False, verbose_name='是否默认')# 自定义一个模型管理器对象objects = AddressManager()class Meta:db_table = 'df_address'verbose_name = '地址'verbose_name_plural = verbose_name

3、order应用下创建订单信息表,订单商品表,继承Basemodel,·

from db.base_model import BaseModel
from django.db import models# 这个是订单相关的表:订单信息表,订单的商品表class OrderInfo(BaseModel):"""订单信息表"""PAY_METHODS_CHOICE = ((1, '货到付款'),(2, '微信支付'),(3, '支付宝'),(4, '银联支付'))ORDER_STATUS_CHOICE = ((1, '待支付'),(2, '待发货'),(3, '待收货'),(4, '待评价'),(5, '已完成'))order_id = models.IntegerField(primary_key=True, verbose_name='订单id')address = models.ForeignKey('user.Address', on_delete=models.CASCADE, verbose_name='地址id')user = models.ForeignKey('user.User', on_delete=models.CASCADE, verbose_name='用户id')pay_method = models.CharField(max_length=32, choices=PAY_METHODS_CHOICE, default=1, verbose_name='支付方式')total_count = models.IntegerField(verbose_name='总的数目')total_price = models.DecimalField(max_digits=128, decimal_places=0,verbose_name='总的金额') # max_digits:数字允许的最大位数;decimal_places:小数的最大位数trans_price = models.DecimalField(max_digits=128, decimal_places=0, verbose_name='运费')order_status = models.CharField(max_length=32, choices=ORDER_STATUS_CHOICE, default=1, verbose_name='订单状态')trade_no = models.IntegerField(verbose_name='支付编号')class Meta:db_table = 'df_order_info'verbose_name_plural = verbose_name = '订单'class OrderGoods(BaseModel):order = models.ForeignKey('OrderInfo', verbose_name='订单', on_delete=models.CASCADE)sku = models.ForeignKey('goods.GoodsSKU', verbose_name='商品SKU', on_delete=models.CASCADE)count = models.IntegerField(default=1, verbose_name='商品数目')price = models.DecimalField(max_digits=12, decimal_places=2, verbose_name='商品价格')comment = models.CharField(max_length=256, default='', verbose_name='评论')class Meta:db_table = 'df_order_goods'verbose_name_plural = verbose_name = '订单商品'

4、goods应用下创建商品类型表,商品SKU表,商品SPU表,商品图片表,首页轮播商品表,首页分类商品展示表,首页促销活动表,继承Basemodel数据库基类。

from django.db import models
from tinymce.models import HTMLField
from db.base_model import BaseModelclass GoodsType(BaseModel):"""商品模型类"""name = models.CharField(max_length=32, verbose_name='种类名称')logo = models.CharField(max_length=32, verbose_name='标识')image = models.ImageField(upload_to='type', verbose_name='商品类型图片')class Meta:db_table = 'df_goods_type'verbose_name_plural = verbose_name = '商品种类'class GoodsSKU(BaseModel):"""商品SKU表"""STATUS_CHOICE = ((0, '下线'), (1, '上线'))type = models.ForeignKey('GoodsType', verbose_name='商品种类',on_delete=models.CASCADE)goods = models.ForeignKey('Goods', verbose_name='商品名称',on_delete=models.CASCADE)name = models.CharField(max_length=20, verbose_name='商品名称')desc = models.CharField(max_length=256, verbose_name='商品简介')price = models.DecimalField(max_digits=32,decimal_places=0, verbose_name='商品价格')unite = models.IntegerField(verbose_name='商品单位')image = models.ImageField(upload_to='goods', verbose_name='商品图片')stock = models.IntegerField(verbose_name='商品库存')sales = models.IntegerField(default=0, verbose_name='商品销量')status = models.CharField(max_length=32,default=1, choices=STATUS_CHOICE, verbose_name='商品状态')class Meta:db_table = 'df_goods_sku'verbose_name_plural = verbose_name = '商品'class Goods(BaseModel):"""商品SPU模型"""name = models.CharField(max_length=56, verbose_name='商品名称')detail = HTMLField(blank=True, verbose_name='商品详情')class Meta:db_table = 'df_goods'verbose_name_plural = verbose_name = '商品SKU'class GoodsImage(BaseModel):"""商品图片"""sku = models.ForeignKey('GoodsSKU', verbose_name='商品',on_delete=models.CASCADE)image = models.ImageField(upload_to='goods', verbose_name='图片路径')class Meta:db_table = 'df_goods_image'verbose_name_plural = verbose_name = '商品图片'class IndexGoodsBanner(BaseModel):"""首页轮播商品展示"""sku = models.ForeignKey('GoodsSKU',on_delete=models.CASCADE)image = models.ImageField(upload_to='banner', verbose_name='图片')index = models.SmallIntegerField(default=0, verbose_name='展示顺序')class Meta:db_table = 'df_index_banner'verbose_name_plural = verbose_name = '首页轮播商品'class IndexTypeGoodsBanner(BaseModel):"""首页分类商品展示模型"""DISPLAY_TYPE_CHOICE = ((0, '标题'), (1, '图片'))type = models.ForeignKey('GoodsType', verbose_name='商品类型',on_delete=models.CASCADE)sku = models.ForeignKey('GoodsSKU', verbose_name='商品SKU',on_delete=models.CASCADE)display_type = models.CharField(max_length=56,default=1, choices=DISPLAY_TYPE_CHOICE, verbose_name='展示类型')index = models.SmallIntegerField(default=0, verbose_name='展示顺序') # 1,2,3,4class Meta:db_table = 'df_index_type_goods'verbose_name_plural = verbose_name = '主页分类展示商品'class IndexPromotionBanner(BaseModel):"""首页促销活动模型"""name = models.CharField(max_length=32, verbose_name='活动名称')url = models.URLField(max_length=256, verbose_name='活动链接')image = models.ImageField(upload_to='banner', verbose_name='活动图片')index = models.SmallIntegerField(default=0, verbose_name='展示顺序')class Meta:db_table = 'df_index_promotion'verbose_name_plural = verbose_name = '主页促销活动'

5、cart 应用下,无需创建模型

自此,模型来创建完成


三、 数据库迁移

*说明:*这里使用的数据库是sqllite,所以就直接迁移就好,
我运用的事django自带的认证系统,所以在setting.py 配置文件中要加入

AUTH_USER_MODEL = 'user.User'

1、生成模型:python manage.py make migrations
2、迁移指令:python manage.py migrate

迁移成功


推荐阅读
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了如何在Mac上使用Pillow库加载不同于默认字体和大小的字体,并提供了一个简单的示例代码。通过该示例,读者可以了解如何在Python中使用Pillow库来写入不同字体的文本。同时,本文也解决了在Mac上使用Pillow库加载字体时可能遇到的问题。读者可以根据本文提供的示例代码,轻松实现在Mac上使用Pillow库加载不同字体的功能。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
author-avatar
枫的Lilyxj
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有